Demo for query storing
Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/csso/CHANGELOG.md b/node_modules/csso/CHANGELOG.md
new file mode 100644
index 0000000..8532124
--- /dev/null
+++ b/node_modules/csso/CHANGELOG.md
@@ -0,0 +1,421 @@
+## 4.2.0 (November 26, 2020)
+
+- Trim Custom Property values when possible (#393)
+- Fixed removing unit for zero-length dimentions in `min()`, `max()` and `clamp()` functions (#426)
+- Fixed crash on bad value in TRBL declaration value (#412)
+
+## 4.1.1 (November 15, 2020)
+
+- Fixed build setup to exclude full `mdn/data` that reduced the lib size:
+ * dist/csso.js: 794.5Kb -> 255.2Kb
+ * dist/csso.min.js: 394.4Kb -> 194.2Kb
+ * package size: 237.8 kB -> 156.1 kB
+ * package unpacked size: 1.3 MB -> 586.8 kB
+
+## 4.1.0 (October 27, 2020)
+
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `^1.0.0`
+- Fixed wrongly merging of TRBL values when one of them contains `var()` (#420)
+- Fixed wrongly merging of pseudo class and element with the same name, e.g. `:-ms-input-placeholder` and `::-ms-input-placeholder` (#383, #416)
+- Fixed wrongly merging of `overflow` fallback (#415)
+
+## 4.0.3 (March 24, 2020)
+
+- Prevented percent sign removal in `flex`/`-ms-flex` (#410)
+- Fixed restructuring optimisation in some cases (@charlessuh & @chsuh, #358, #411)
+- Bumped dependencies (@AviVahl, #409)
+
+## 4.0.2 (October 28, 2019)
+
+- Fixed clean stage to avoid exceptions when source has unparsed or bad parts (#380)
+- Fixed wrong percentage sign removal for zero values (#395)
+
+## 4.0.1 (October 22, 2019)
+
+- Bumped CSSTree to [`1.0.0-alpha.37`](https://github.com/csstree/csstree/releases/tag/v1.0.0-alpha.37) to avoid source map generation inconsistency across Node.js versions
+
+## 4.0.0 (October 21, 2019)
+
+- Dropped support for Node.js < 8
+- Refreshed dev dependencies and scripts
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `1.0.0-alpha.36` (#399)
+- Changed bundle files: `dist/csso.js` and `dist/csso.min.js` instead single `dist/csso-browser.js` (min version)
+- Expose `compress()` as `syntax.compress()`
+
+## 3.5.1 (June 7, 2018)
+
+- Bumped [CSSTree](https://github.com/csstree/csstree) to `1.0.0-alpha.29` (fixes some issues)
+
+## 3.5.0 (January 14, 2018)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) `1.0.0-alpha.27`
+
+## 3.4.0 (November 3, 2017)
+
+- Added percent sign removal for zero percentages for some properties that is safe (@RubaXa, #286)
+- Removed unit removal for zero values in `-ms-flex` due it breaks flex in IE10/11 (#362)
+- Improved performance of selectors comparison (@smelukov, #343)
+
+## 3.3.1 (October 17, 2017)
+
+- Fixed merge of `position` declarations when `sticky` fallback is using (@gruzzilkin, #356)
+
+## 3.3.0 (October 12, 2017)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) `1.0.0-alpha25`
+ - Changed AST format (see [CSSTree change log](https://github.com/csstree/csstree/blob/master/HISTORY.md) for details)
+ - Fixed performance issue when generate CSS with source map (quadratic increase in time depending on the size of the CSS)
+
+## 3.2.0 (September 10, 2017)
+
+- Fixed named color compression to apply only when an identifier is guaranteed to be a color
+- Added lifting of `@keyframes` to the beginning of style sheet (chunk), but after `@charset` and `@import` rules
+- Added removal of `@keyframes`, `@media` and `@supports` with no prelude
+- Added removal of duplicate `@keyframes` (#202)
+- Added new option `forceMediaMerge` to force media rules merging. It's unsafe in general, but works fine in many cases. Use it on your own risk (#350)
+- Bumped `CSSTree` to `1.0.0-alpha23`
+
+## 3.1.1 (April 25, 2017)
+
+- Fixed crash on a number processing when it used not in a list (#335)
+
+## 3.1.0 (April 24, 2017)
+
+- Implemented optimisation for `none` keyword in `border` and `outline` properties (@zoobestik, #41)
+- Implemented replacing `rgba(x, x, x, 0)` to `transparent`
+- Fixed plus sign omitting for numbers following identifier, hex color, number or unicode range, since it can change the meaning of CSS (e.g. `calc(1px+2px)` has been optimized to `calc(1px2px)` before, now it stays the same)
+- Improved usage filtering for nested selectors (i.e. for `:nth-*()`, `:has()`, `:matches` and other pseudos)
+- Implemented `blacklist` filtering in usage (#334, see [Black list filtering](https://github.com/css/csso#black-list-filtering))
+- Improved white space removing, now white spaces are removing in the beginning and at the ending of sequences, and between stylesheet and block nodes
+- Bumped `CSSTree` to `1.0.0-alpha19`
+
+## 3.0.1 (March 14, 2017)
+
+- Fixed declaration merging when declaration contains an `!important`
+
+## 3.0.0 (March 13, 2017)
+
+- Migrated to [CSSTree](https://github.com/csstree/csstree) as AST backend and exposed its API behind `syntax` property
+- Extracted CLI into standalone package [css/csso-cli](https://github.com/css/csso-cli)
+
+## 2.3.1 (January 6, 2017)
+
+- Added `\0` IE hack support (#320)
+
+## 2.3.0 (October 25, 2016)
+
+- Added `beforeCompress` and `afterCompress` options support (#316)
+- Fixed crash on empty argument in function (#317)
+
+## 2.2.1 (July 25, 2016)
+
+- Fixed shorthand optimisation issue when value has a color value or something unknown (#311)
+- Fixed `cursor` broken fallback (#306)
+
+## 2.2.0 (June 23, 2016)
+
+- Implement AST cloning by adding `clone()` [function](https://github.com/css/csso#cloneast) and `clone` [option](https://github.com/css/csso#compressast-options) for `compress()` function (#296)
+- Fix parse and translate attribute selector with flags but w/o operator (i.e. `[attrName i]`)
+- Don't merge rules with flagged attribute selectors with others (#291)
+- Take in account functions when merge TRBL-properties (#297, thanks to @ArturAralin)
+- Improve partial merge (#304)
+- Tweak scanner, reduce code deoptimizations and other small improvements
+
+## 2.1.1 (May 11, 2016)
+
+- Fix wrong declaration with `\9` hack merge (#295)
+
+## 2.1.0 (May 8, 2016)
+
+- New option `comments` to specify what comments to left: `exclamation`, `first-exclamation` and `none`
+- Add `offset` to CSS parse error details
+- Fix token `offset` computation
+
+## 2.0.0 (April 5, 2016)
+
+- No more `gonzales` AST format and related code
+- `minify()` and `minifyBlock()` is always return an object as result now (i.e. `{ css: String, map: SourceMapGenerator or null }`)
+- `parse()`
+ - Returns AST in new format (so called `internal`)
+ - Dynamic scanner implemented
+ - New AST format + dynamic scanner = performance boost and less memory consumption
+ - No more `context` argument, context should be specified via `options`
+ - Supported contexts now: `stylesheet`, `atrule`, `atruleExpression`, `ruleset`, `selector`, `simpleSelector`, `block`, `declaration` and `value`
+ - Drop `needPositions` option, `positions` option should be used instead
+ - Drop `needInfo` option, `info` object is attaching to nodes when some information is requested by `options`
+ - `options` should be an object, otherwise it treats as empty object
+- `compress()`
+ - No more AST converting (performance boost and less memory consumption)
+ - Drop `outputAst` option
+ - Returns an object as result instead of AST (i.e. `{ ast: Object }`)
+- Drop methods: `justDoIt()`, `stringify()`, `cleanInfo()`
+
+## 1.8.1 (March 30, 2016)
+
+- Don't remove spaces after function/braces/urls since unsafe (#289)
+
+## 1.8.0 (March 24, 2016)
+
+- Usage data support:
+ - Filter rulesets by tag names, class names and ids white lists.
+ - More aggressive ruleset moving using class name scopes information.
+ - New CLI option `--usage` to pass usage data file.
+- Improve initial ruleset merge
+ - Change order of ruleset processing, now it's left to right. Previously unmerged rulesets may prevent lookup and other rulesets merge.
+ - Difference in pseudo signature just prevents ruleset merging, but don't stop lookup.
+ - Simplify block comparison (performance).
+- New method `csso.minifyBlock()` for css block compression (e.g. `style` attribute content).
+- Ruleset merge improvement: at-rules with block (like `@media` or `@supports`) now can be skipped during ruleset merge lookup if doesn't contain something prevents it.
+- FIX: Add negation (`:not()`) to pseudo signature to avoid unsafe merge (old browsers doesn't support it).
+- FIX: Check nested parts of value when compute compatibility. It fixes unsafe property merging.
+
+## 1.7.1 (March 16, 2016)
+
+- pass block mode to tokenizer for correct parsing of declarations properties with `//` hack
+- fix wrongly `@import` and `@charset` removal on double exclamation comment
+
+## 1.7.0 (March 10, 2016)
+
+- support for [CSS Custom Properties](https://www.w3.org/TR/css-variables/) (#279)
+- rework RTBL properties merge – better merge for values with special units and don't merge values with CSS-wide keywords (#255)
+- remove redundant universal selectors (#178)
+- take in account `!important` when check for property overriding (#280)
+- don't merge `text-align` declarations with some values (#281)
+- add spaces around `/deep/` combinator on translate, since it together with universal selector can produce a comment
+- better keyword and property name resolving (tolerant to hacks and so on)
+- integration improvements
+ - compression log function could be customized by `logger` option for `compress()` and `minify()`
+ - make possible to set initial line and column for parser
+
+## 1.6.4 (March 1, 2016)
+
+- `npm` publish issue (#276)
+
+## 1.6.3 (February 29, 2016)
+
+- add `file` to generated source map since other tools can relay on it in source map transform chain
+
+## 1.6.2 (February 29, 2016)
+
+- tweak some parse error messages and their positions
+- fix `:not()` parsing and selector groups in `:not()` is supported now (#215)
+- `needPosition` parser option is deprecated, `positions` option should be used instead (`needPosition` is used still if `positions` option omitted)
+- expose internal AST API as `csso.internal.*`
+- `minify()` adds `sourcesContent` by default when source map is generated
+- bring back support for node.js `0.10` until major release (#275)
+
+## 1.6.1 (February 28, 2016)
+
+- fix exception on zero length dimension compress outside declaration (#273)
+
+## 1.6.0 (February 27, 2016)
+
+- **source maps support**
+- parser remake:
+ - various parsing issues fixed
+ - fix unicode sequence processing in ident (#191)
+ - support for flags in attribute selector (#270)
+ - position (line and column) of parse error (#109)
+ - 4x performance boost, less memory consumption
+- compressor refactoring
+ - internal AST is using doubly linked lists (with safe transformation support during iteration) instead of arrays
+ - rename `restructuring` to `restructure` option for `minify()`/`compress()` (`restructuring` is alias for `restructure` now, with lower priority)
+ - unquote urls when possible (#141, #60)
+- setup code coverage and a number of related fixes
+- add eslint to check unused things
+
+## 1.5.4 (January 27, 2016)
+
+- one more fix (in `restructRuleset` this time) with merge of rulesets when a ruleset with same specificity places between them (#264)
+- disable partial merge of rulesets in `@keyframes` rulesets (until sure it's correct)
+
+## 1.5.3 (January 25, 2016)
+
+- don't override display values with different browser support (#259)
+- fix publish issue (one of modules leak in development state)
+
+## 1.5.2 (January 24, 2016)
+
+- don't merge rulesets if between them a ruleset with same specificity (#264)
+
+## 1.5.1 (January 14, 2016)
+
+- ensure `-` is not used as an identifier in attribute selectors (thanks to @mathiasbynens)
+- fix broken `justDoIt()` function
+- various small fixes
+
+## 1.5.0 (January 14, 2016)
+
+### Parser
+
+- attach minus to number
+
+### Compressor
+
+- split code base into small modules and related refactoring
+- introduce internal AST format for compressor (`gonzales`→`internal` and `internal`→`gonzales` convertors, walkers, translator)
+- various optimizations: no snapshots, using caches and indexes
+- sort selectors, merge selectors in alphabet order
+- compute selector's specificity
+- better ruleset restructuring, improve compression of partially equal blocks
+- better ruleset merge – not only closest but also disjoined by other rulesets when safe
+- join `@media` with same query
+- `outputAst` – new option to specify output AST format (`gonzales` by default for backward compatibility)
+- remove quotes surrounding attribute values in attribute selectors when possible (#73)
+- replace `from`→`0%` and `100%`→`to` at `@keyframes` (#205)
+- prevent partial merge of rulesets at `@keyframes` (#80, #197)
+
+### API
+
+- walker for `gonzales` AST was implemented
+
+### CLI
+
+- new option `--stat` (output stat in `stderr`)
+- new optional parameter `level` for `--debug` option
+
+## 1.4.4 (December 10, 2015)
+
+- prevent removal of spaces after braces that before identifier that breaking at-rules expressions (#258)
+
+## 1.4.3 (December 4, 2015)
+
+- fix unicode-range parsing that cause to wrong function detection (#250)
+
+## 1.4.2 (November 9, 2015)
+
+- allow spaces between `progid:` and rest part of value for IE's `filter` property as `autoprefixer` generates this kind of code (#249)
+- fixes for Windows:
+ - correct processing new lines
+ - normalize file content in test suite
+- fixes to work in strict mode (#252)
+- init compressor dictionaries for every css block (#248, #251)
+- bump uglify-js version
+
+## 1.4.1 (October 20, 2015)
+
+- allow merge for `display` property (#167, #244)
+- more accurate `rect` (`clip` property value) merge
+- fix typo when specifying options in cli (thanks to @Taritsyn)
+- fix safe unit values merge with keyword values (#244)
+- fix wrong descendant combinator removal (#246)
+- build browser version on `prepublish` (thanks to @silentroach)
+- parser: store whitespaces as single token (performance and reduce memory consumption)
+- rearrange compress tests layout
+
+## 1.4 (October 16, 2015)
+
+Bringing project back to life. Changed files structure, cleaned up and refactored most of sources.
+
+### Common
+
+- single code base (no more `src` folder)
+- build browser version with `browserify` (no more `make`, and `web` folder), browser version is available at `dist/csso-browser.js`
+- main file is `lib/index.js` now
+- minimal `node.js` version is `0.12` now
+- restrict file list to publish on npm (no more useless folders and files in package)
+- add `jscs` to control code style
+- automate `gh-pages` update
+- util functions reworked
+- translator reworked
+- test suite reworked
+- compressor refactored
+- initial parser refactoring
+
+### API
+
+- new method `minify(src, options)`, options:
+ - `restructuring` – if set to `false`, disable structure optimisations (`true` by default)
+ - `debug` - outputs intermediate state of CSS during compression (`false` by default)
+- deprecate `justDoIt()` method (use `minify` instead)
+- rename `treeToString()` method to `stringify()`
+- drop `printTree()` method
+- AST node info
+ - `column` and `offset` added
+ - `ln` renamed to `line`
+ - fix line counting across multiple files and input with CR LF (#147)
+
+### CLI
+
+- completely reworked, use [clap](https://github.com/lahmatiy/clap) to parse argv
+- add support for input from stdin (#128)
+- drop undocumented and obsoleted options `--rule` and `--parser` (suppose nobody use it)
+- drop `-off` alias for `--restructure-off` as incorrect (only one letter options should starts with single `-`)
+- new option `--debug` that reflecting to `options.debug` for `minify`
+
+### Parsing and optimizations
+
+- keep all exclamation comments (#194)
+- add `/deep/` combinator support (#209)
+- attribute selector
+ - allow colon in attribute name (#237)
+ - support for namespaces (#233)
+- color
+ - support all css/html colors
+ - convert `hsla` to `rgba` and `hls` to `rgb`
+ - convert `rgba` with 1 as alpha value to `rgb` (#122)
+ - interpolate `rgb` and `rgba` percentage values to absolute values
+ - replace percentage values in `rgba` for normalized/interpolated values
+ - lowercase hex colors and color names (#169)
+ - fix color minification when hex value replaced for color name (#176)
+ - fit rgb values to 0..255 range (#181)
+- calc
+ - remove spaces for multiple operator in calc
+ - don't remove units inside calc (#222)
+ - fix wrong white space removal around `+` and `-` (#228)
+- don't remove units in `flex` property as it could change value meaning (#200)
+- don't merge `\9` hack values (#231)
+- merge property values only if they have the same functions (#150, #227)
+- don't merge property values with some sort of units (#140, #161)
+- fix `!important` issue for `top-right-bottom-left` properties (#189)
+- fix `top-right-bottom-left` properties merge (#139, #175)
+- support for unicode-range (#148)
+- don't crash on ruleset with no selector (#135)
+- tolerant to class names that starts with digit (#99, #105)
+- fix background compressing (#170)
+
+## 1.3.12 (October 8, 2015)
+
+- Case insensitive check for `!important` (#187)
+- Fix problems with using `csso` as cli command on Windows (#83, #136, #142 and others)
+- Remove byte order marker (the UTF-8 BOM) from input
+- Don't strip space between funktion-funktion and funktion-vhash (#134)
+- Don't merge TRBL values having \9 (hack for IE8 in bootstrap) (#159, #214, #230, #231 and others)
+- Don't strip units off dimensions of non-length (#226, #229 and others)
+
+## 1.3.7 (February 11, 2013)
+
+- Gonzales 1.0.7.
+
+## 1.3.6 (November 26, 2012)
+
+- Gonzales 1.0.6.
+
+## 1.3.5 (October 28, 2012)
+
+- Gonzales 1.0.5.
+- Protecting copyright notices in CSS: https://github.com/css/csso/issues/92
+- Zero CSS throws an error: https://github.com/css/csso/issues/96
+- Don't minify the second `0s` in Firefox for animations: https://github.com/css/csso/issues/100
+- Japan manual
+- BEM ready documentation
+
+## 1.3.4 (October 10, 2012)
+
+- @page inside @media Causes Error: https://github.com/css/csso/issues/90
+
+## 1.3.3 (October 9, 2012)
+
+- CSSO 1.3.2 compresses ".t-1" and ".t-01" as identical classes: https://github.com/css/csso/issues/88
+
+## 1.3.2 (October 8, 2012)
+
+- filter + important breaks CSSO v1.3.1: https://github.com/css/csso/issues/87
+
+## 1.3.1 (October 8, 2012)
+
+- "filter" IE property breaks CSSO v1.3.0: https://github.com/css/csso/issues/86
+
+## 1.3.0 (October 4, 2012)
+
+- PeCode CSS parser replaced by Gonzales CSS parser
diff --git a/node_modules/csso/LICENSE b/node_modules/csso/LICENSE
new file mode 100644
index 0000000..9f982eb
--- /dev/null
+++ b/node_modules/csso/LICENSE
@@ -0,0 +1,20 @@
+Copyright (C) 2015-2019 by Roman Dvornov
+Copyright (C) 2011-2015 by Sergey Kryzhanovsky
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/csso/README.md b/node_modules/csso/README.md
new file mode 100644
index 0000000..6395bc1
--- /dev/null
+++ b/node_modules/csso/README.md
@@ -0,0 +1,372 @@
+[](https://www.npmjs.com/package/csso)
+[](https://travis-ci.org/css/csso)
+[](https://coveralls.io/github/css/csso?branch=master)
+[](https://www.npmjs.com/package/csso)
+[](https://twitter.com/cssoptimizer)
+
+CSSO (CSS Optimizer) is a CSS minifier. It performs three sort of transformations: cleaning (removing redundant), compression (replacement for shorter form) and restructuring (merge of declarations, rulesets and so on). As a result your CSS becomes much smaller.
+
+[](https://www.yandex.com/)
+[](https://www.avito.ru/)
+
+## Ready to use
+
+- [Web interface](http://css.github.io/csso/csso.html)
+- [csso-cli](https://github.com/css/csso-cli) – command line interface
+- [gulp-csso](https://github.com/ben-eb/gulp-csso) – `Gulp` plugin
+- [grunt-csso](https://github.com/t32k/grunt-csso) – `Grunt` plugin
+- [broccoli-csso](https://github.com/sindresorhus/broccoli-csso) – `Broccoli` plugin
+- [postcss-csso](https://github.com/lahmatiy/postcss-csso) – `PostCSS` plugin
+- [csso-loader](https://github.com/sandark7/csso-loader) – `webpack` loader
+- [csso-webpack-plugin](https://github.com/zoobestik/csso-webpack-plugin) – `webpack` plugin
+- [CSSO Visual Studio Code plugin](https://marketplace.visualstudio.com/items?itemName=Aneryu.csso)
+
+## Install
+
+```
+npm install csso
+```
+
+## API
+
+<!-- TOC depthfrom:3 -->
+
+- [minify(source[, options])](#minifysource-options)
+- [minifyBlock(source[, options])](#minifyblocksource-options)
+- [syntax.compress(ast[, options])](#syntaxcompressast-options)
+- [Source maps](#source-maps)
+- [Usage data](#usage-data)
+ - [White list filtering](#white-list-filtering)
+ - [Black list filtering](#black-list-filtering)
+ - [Scopes](#scopes)
+
+<!-- /TOC -->
+
+Basic usage:
+
+```js
+var csso = require('csso');
+
+var minifiedCss = csso.minify('.test { color: #ff0000; }').css;
+
+console.log(minifiedCss);
+// .test{color:red}
+```
+
+CSSO is based on [CSSTree](https://github.com/csstree/csstree) to parse CSS into AST, AST traversal and to generate AST back to CSS. All `CSSTree` API is available behind `syntax` field. You may minify CSS step by step:
+
+```js
+var csso = require('csso');
+var ast = csso.syntax.parse('.test { color: #ff0000; }');
+var compressedAst = csso.syntax.compress(ast).ast;
+var minifiedCss = csso.syntax.generate(compressedAst);
+
+console.log(minifiedCss);
+// .test{color:red}
+```
+
+> Warning: CSSO uses early versions of CSSTree that still in active development. CSSO doesn't guarantee API behind `syntax` field or AST format will not change in future releases of CSSO, since it's subject to change in CSSTree. Be careful with CSSO updates if you use `syntax` API until this warning removal.
+
+### minify(source[, options])
+
+Minify `source` CSS passed as `String`.
+
+```js
+var result = csso.minify('.test { color: #ff0000; }', {
+ restructure: false, // don't change CSS structure, i.e. don't merge declarations, rulesets etc
+ debug: true // show additional debug information:
+ // true or number from 1 to 3 (greater number - more details)
+});
+
+console.log(result.css);
+// > .test{color:red}
+```
+
+Returns an object with properties:
+
+- css `String` – resulting CSS
+- map `Object` – instance of [`SourceMapGenerator`](https://github.com/mozilla/source-map#sourcemapgenerator) or `null`
+
+Options:
+
+- sourceMap
+
+ Type: `Boolean`
+ Default: `false`
+
+ Generate a source map when `true`.
+
+- filename
+
+ Type: `String`
+ Default: `'<unknown>'`
+
+ Filename of input CSS, uses for source map generation.
+
+- debug
+
+ Type: `Boolean`
+ Default: `false`
+
+ Output debug information to `stderr`.
+
+- beforeCompress
+
+ Type: `function(ast, options)` or `Array<function(ast, options)>` or `null`
+ Default: `null`
+
+ Called right after parse is run.
+
+- afterCompress
+
+ Type: `function(compressResult, options)` or `Array<function(compressResult, options)>` or `null`
+ Default: `null`
+
+ Called right after [`syntax.compress()`](#syntaxcompressast-options) is run.
+
+- Other options are the same as for [`syntax.compress()`](#syntaxcompressast-options) function.
+
+### minifyBlock(source[, options])
+
+The same as `minify()` but for list of declarations. Usually it's a `style` attribute value.
+
+```js
+var result = csso.minifyBlock('color: rgba(255, 0, 0, 1); color: #ff0000');
+
+console.log(result.css);
+// > color:red
+```
+
+### syntax.compress(ast[, options])
+
+Does the main task – compress an AST. This is CSSO's extension in CSSTree syntax API.
+
+> NOTE: `syntax.compress()` performs AST compression by transforming input AST by default (since AST cloning is expensive and needed in rare cases). Use `clone` option with truthy value in case you want to keep input AST untouched.
+
+Returns an object with properties:
+
+- ast `Object` – resulting AST
+
+Options:
+
+- restructure
+
+ Type: `Boolean`
+ Default: `true`
+
+ Disable or enable a structure optimisations.
+
+- forceMediaMerge
+
+ Type: `Boolean`
+ Default: `false`
+
+ Enables merging of `@media` rules with the same media query by splitted by other rules. The optimisation is unsafe in general, but should work fine in most cases. Use it on your own risk.
+
+- clone
+
+ Type: `Boolean`
+ Default: `false`
+
+ Transform a copy of input AST if `true`. Useful in case of AST reuse.
+
+- comments
+
+ Type: `String` or `Boolean`
+ Default: `true`
+
+ Specify what comments to leave:
+
+ - `'exclamation'` or `true` – leave all exclamation comments (i.e. `/*! .. */`)
+ - `'first-exclamation'` – remove every comment except first one
+ - `false` – remove all comments
+
+- usage
+
+ Type: `Object` or `null`
+ Default: `null`
+
+ Usage data for advanced optimisations (see [Usage data](#usage-data) for details)
+
+- logger
+
+ Type: `Function` or `null`
+ Default: `null`
+
+ Function to track every step of transformation.
+
+### Source maps
+
+To get a source map set `true` for `sourceMap` option. Additianaly `filename` option can be passed to specify source file. When `sourceMap` option is `true`, `map` field of result object will contain a [`SourceMapGenerator`](https://github.com/mozilla/source-map#sourcemapgenerator) instance. This object can be mixed with another source map or translated to string.
+
+```js
+var csso = require('csso');
+var css = fs.readFileSync('path/to/my.css', 'utf8');
+var result = csso.minify(css, {
+ filename: 'path/to/my.css', // will be added to source map as reference to source file
+ sourceMap: true // generate source map
+});
+
+console.log(result);
+// { css: '...minified...', map: SourceMapGenerator {} }
+
+console.log(result.map.toString());
+// '{ .. source map content .. }'
+```
+
+Example of generating source map with respect of source map from input CSS:
+
+```js
+var require('source-map');
+var csso = require('csso');
+var inputFile = 'path/to/my.css';
+var input = fs.readFileSync(inputFile, 'utf8');
+var inputMap = input.match(/\/\*# sourceMappingURL=(\S+)\s*\*\/\s*$/);
+var output = csso.minify(input, {
+ filename: inputFile,
+ sourceMap: true
+});
+
+// apply input source map to output
+if (inputMap) {
+ output.map.applySourceMap(
+ new SourceMapConsumer(inputMap[1]),
+ inputFile
+ )
+}
+
+// result CSS with source map
+console.log(
+ output.css +
+ '/*# sourceMappingURL=data:application/json;base64,' +
+ new Buffer(output.map.toString()).toString('base64') +
+ ' */'
+);
+```
+
+### Usage data
+
+`CSSO` can use data about how `CSS` is used in a markup for better compression. File with this data (`JSON`) can be set using `usage` option. Usage data may contain following sections:
+
+- `blacklist` – a set of black lists (see [Black list filtering](#black-list-filtering))
+- `tags` – white list of tags
+- `ids` – white list of ids
+- `classes` – white list of classes
+- `scopes` – groups of classes which never used with classes from other groups on the same element
+
+All sections are optional. Value of `tags`, `ids` and `classes` should be an array of a string, value of `scopes` should be an array of arrays of strings. Other values are ignoring.
+
+#### White list filtering
+
+`tags`, `ids` and `classes` are using on clean stage to filter selectors that contain something not in the lists. Selectors are filtering only by those kind of simple selector which white list is specified. For example, if only `tags` list is specified then type selectors are checking, and if all type selectors in selector present in list or selector has no any type selector it isn't filter.
+
+> `ids` and `classes` are case sensitive, `tags` – is not.
+
+Input CSS:
+
+```css
+* { color: green; }
+ul, ol, li { color: blue; }
+UL.foo, span.bar { color: red; }
+```
+
+Usage data:
+
+```json
+{
+ "tags": ["ul", "LI"]
+}
+```
+
+Resulting CSS:
+
+```css
+*{color:green}ul,li{color:blue}ul.foo{color:red}
+```
+
+Filtering performs for nested selectors too. `:not()` pseudos content is ignoring since the result of matching is unpredictable. Example for the same usage data as above:
+
+```css
+:nth-child(2n of ul, ol) { color: red }
+:nth-child(3n + 1 of img) { color: yellow }
+:not(div, ol, ul) { color: green }
+:has(:matches(ul, ol), ul, ol) { color: blue }
+```
+
+Turns into:
+
+```css
+:nth-child(2n of ul){color:red}:not(div,ol,ul){color:green}:has(:matches(ul),ul){color:blue}
+```
+
+#### Black list filtering
+
+Black list filtering performs the same as white list filtering, but filters things that mentioned in the lists. `blacklist` can contain the lists `tags`, `ids` and `classes`.
+
+Black list has a higher priority, so when something mentioned in the white list and in the black list then white list occurrence is ignoring. The `:not()` pseudos content ignoring as well.
+
+```css
+* { color: green; }
+ul, ol, li { color: blue; }
+UL.foo, li.bar { color: red; }
+```
+
+Usage data:
+
+```json
+{
+ "blacklist": {
+ "tags": ["ul"]
+ },
+ "tags": ["ul", "LI"]
+}
+```
+
+Resulting CSS:
+
+```css
+*{color:green}li{color:blue}li.bar{color:red}
+```
+
+#### Scopes
+
+Scopes is designed for CSS scope isolation solutions such as [css-modules](https://github.com/css-modules/css-modules). Scopes are similar to namespaces and define lists of class names that exclusively used on some markup. This information allows the optimizer to move rules more agressive. Since it assumes selectors from different scopes don't match for the same element. This can improve rule merging.
+
+Suppose we have a file:
+
+```css
+.module1-foo { color: red; }
+.module1-bar { font-size: 1.5em; background: yellow; }
+
+.module2-baz { color: red; }
+.module2-qux { font-size: 1.5em; background: yellow; width: 50px; }
+```
+
+It can be assumed that first two rules are never used with the second two on the same markup. But we can't say that for sure without a markup review. The optimizer doesn't know it either and will perform safe transformations only. The result will be the same as input but with no spaces and some semicolons:
+
+```css
+.module1-foo{color:red}.module1-bar{font-size:1.5em;background:#ff0}.module2-baz{color:red}.module2-qux{font-size:1.5em;background:#ff0;width:50px}
+```
+
+With usage data `CSSO` can produce better output. If follow usage data is provided:
+
+```json
+{
+ "scopes": [
+ ["module1-foo", "module1-bar"],
+ ["module2-baz", "module2-qux"]
+ ]
+}
+```
+
+The result will be (29 bytes extra saving):
+
+```css
+.module1-foo,.module2-baz{color:red}.module1-bar,.module2-qux{font-size:1.5em;background:#ff0}.module2-qux{width:50px}
+```
+
+If class name isn't mentioned in the `scopes` it belongs to default scope. `scopes` data doesn't affect `classes` whitelist. If class name mentioned in `scopes` but missed in `classes` (both sections are specified) it will be filtered.
+
+Note that class name can't be set for several scopes. Also a selector can't have class names from different scopes. In both cases an exception will thrown.
+
+Currently the optimizer doesn't care about changing order safety for out-of-bounds selectors (i.e. selectors that match to elements without class name, e.g. `.scope div` or `.scope ~ :last-child`). It assumes that scoped CSS modules doesn't relay on it's order. It may be fix in future if to be an issue.
diff --git a/node_modules/csso/dist/csso.js b/node_modules/csso/dist/csso.js
new file mode 100644
index 0000000..8e9187b
--- /dev/null
+++ b/node_modules/csso/dist/csso.js
@@ -0,0 +1,3322 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = global || self, factory(global.csso = {}));
+}(this, (function (exports) { 'use strict';
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ var csstree_min = createCommonjsModule(function (module, exports) {
+ !function(e,t){module.exports=t();}(commonjsGlobal,(function(){function e(e){return {prev:null,next:null,data:e}}function t(e,t,n){var i;return null!==r?(i=r,r=r.cursor,i.prev=t,i.next=n,i.cursor=e.cursor):i={prev:t,next:n,cursor:e.cursor},e.cursor=i,i}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t;}var r=null,i=function(){this.cursor=null,this.head=null,this.tail=null;};i.createItem=e,i.prototype.createItem=e,i.prototype.updateCursors=function(e,t,n,r){for(var i=this.cursor;null!==i;)i.prev===e&&(i.prev=t),i.next===n&&(i.next=r),i=i.cursor;},i.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},i.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var i=e(t[r]);null!==n?n.next=i:this.head=i,i.prev=n,n=i;}return this.tail=n,this},i.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},i.prototype.toJSON=i.prototype.toArray,i.prototype.isEmpty=function(){return null===this.head},i.prototype.first=function(){return this.head&&this.head.data},i.prototype.last=function(){return this.tail&&this.tail.data},i.prototype.each=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,null,this.head);null!==a.next;)i=a.next,a.next=i.next,e.call(r,i.data,i,this);n(this);},i.prototype.forEach=i.prototype.each,i.prototype.eachRight=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,this.tail,null);null!==a.prev;)i=a.prev,a.prev=i.prev,e.call(r,i.data,i,this);n(this);},i.prototype.forEachRight=i.prototype.eachRight,i.prototype.reduce=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)a=o.next,o.next=a.next,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.reduceRight=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)a=o.prev,o.prev=a.prev,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.nextUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,null,e);null!==o.next&&(a=o.next,o.next=a.next,!r.call(i,a.data,a,this)););n(this);}},i.prototype.prevUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,e,null);null!==o.prev&&(a=o.prev,o.prev=a.prev,!r.call(i,a.data,a,this)););n(this);}},i.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return !0;n=n.next;}return !1},i.prototype.map=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},i.prototype.filter=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},i.prototype.clear=function(){this.head=null,this.tail=null;},i.prototype.copy=function(){for(var t=new i,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},i.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},i.prototype.prependData=function(t){return this.prepend(e(t))},i.prototype.append=function(e){return this.insert(e)},i.prototype.appendData=function(t){return this.insert(e(t))},i.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e);}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},i.prototype.insertData=function(t,n){return this.insert(e(t),n)},i.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else {if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next;}if(null!==e.next)e.next.prev=e.prev;else {if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev;}return e.prev=null,e.next=null,e},i.prototype.push=function(t){this.insert(e(t));},i.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},i.prototype.unshift=function(t){this.prepend(e(t));},i.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},i.prototype.prependList=function(e){return this.insertList(e,this.head)},i.prototype.appendList=function(e){return this.insertList(e)},i.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},i.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e);};var a=i,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return (r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),i=e.line,a=e.column,o=Math.max(1,i-t)-1,s=Math.min(i+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(a+=(" ".length-1)*(r[i-1].substr(0,a-1).match(/\t/g)||[]).length)>100&&(c=a-60+3,a=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g," "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return [n(o,i),new Array(a+l+2).join("-")+"^",n(i,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,i){var a=o("SyntaxError",e);return a.source=t,a.offset=n,a.line=r,a.column=i,a.sourceFragment=function(e){return s(a,isNaN(e)?0:e)},Object.defineProperty(a,"formattedMessage",{get:function(){return "Parse error: "+a.message+"\n"+s(a,2)}}),a.parseError={offset:n,line:r,column:i},a},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function p(e){return e>=48&&e<=57}function d(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function g(e){return d(e)||m(e)}function f(e){return e>=128}function b(e){return g(e)||f(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function k(e){return 10===e||13===e||12===e}function v(e){return k(e)||32===e||9===e}function x(e,t){return 92===e&&(!k(t)&&0!==t)}var w=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<w.length;S++)switch(!0){case v(S):w[S]=C.WhiteSpace;break;case p(S):w[S]=C.Digit;break;case b(S):w[S]=C.NameStart;break;case y(S):w[S]=C.NonPrintable;break;default:w[S]=S||C.Eof;}function C(e){return e<128?w[e]:C.NameStart}var z={isDigit:p,isHexDigit:function(e){return p(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:d,isLowercaseLetter:m,isLetter:g,isNonAscii:f,isNameStart:b,isName:function(e){return b(e)||p(e)||45===e},isNonPrintable:y,isNewline:k,isWhiteSpace:v,isValidEscape:x,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||x(t,n):!!b(e)||92===e&&x(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?p(t)?2:46===t&&p(n)?3:0:46===e?p(t)?2:0:p(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},A=z.isDigit,P=z.isHexDigit,T=z.isUppercaseLetter,L=z.isName,E=z.isWhiteSpace,D=z.isValidEscape;function O(e,t){return t<e.length?e.charCodeAt(t):0}function B(e,t,n){return 13===n&&10===O(e,t+1)?2:1}function I(e,t,n){var r=e.charCodeAt(t);return T(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&A(e.charCodeAt(t));t++);return t}function R(e,t){if(P(O(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(O(e,t));t++);var r=O(e,t);E(r)&&(t+=B(e,t,r));}return t}var M={consumeEscaped:R,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!L(n)){if(!D(n,O(e,t+1)))break;t=R(e,t)-1;}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),A(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&A(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),I(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),A(n)&&(t=N(e,t+1+r+1));}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}D(n,O(e,t+1))&&(t=R(e,t));}return t},cmpChar:I,cmpStr:function(e,t,n,r){if(n-t!==r.length)return !1;if(t<0||n>e.length)return !1;for(var i=t;i<n;i++){var a=e.charCodeAt(i),o=r.charCodeAt(i-t);if(T(a)&&(a|=32),a!==o)return !1}return !0},getNewlineLength:B,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,F=M.cmpStr,W=j.EOF,q=j.WhiteSpace,Y=j.Comment,U=function(){this.offsetAndType=null,this.balance=null,this.reset();};U.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset;},lookupType:function(e){return (e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return (e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return (e+=this.tokenIndex)<this.tokenCount&&F(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,i=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,i)){case 1:break e;case 2:r++;break e;default:i=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n);}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===q;e++,t++);t>0&&this.skip(t);},skipSC:function(){for(;this.tokenType===q||this.tokenType===Y;)this.next();},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next());},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length);},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,i=this.offsetAndType[t],a=16777215&i;n=a,e(i>>24,r,a,t);}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,i)=>{e[i]={idx:i,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[i]};}),e}};var H=U;function V(e){return e}function K(e,t,n,r){var i,a;switch(e.type){case"Group":i=function(e,t,n,r){var i=" "===e.combinator||r?e.combinator:" "+e.combinator+" ",a=e.terms.map((function(e){return K(e,t,n,r)})).join(i);return (e.explicit||n)&&(a=(r||","===a[0]?"[":"[ ")+a+(r?"]":" ]")),a}(e,t,n,r)+(e.disallowEmpty?"!":"");break;case"Multiplier":return K(e.term,t,n,r)+t(0===(a=e).min&&0===a.max?"*":0===a.min&&1===a.max?"?":1===a.min&&0===a.max?a.comma?"#":"+":1===a.min&&1===a.max?"":(a.comma?"#":"")+(a.min===a.max?"{"+a.min+"}":"{"+a.min+","+(0!==a.max?a.max:"")+"}"),e);case"Type":i="<"+e.name+(e.opts?t(function(e){switch(e.type){case"Range":return " ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(e.opts),e.opts):"")+">";break;case"Property":i="<'"+e.name+"'>";break;case"Keyword":i=e.name;break;case"AtKeyword":i="@"+e.name;break;case"Function":i=e.name+"(";break;case"String":case"Token":i=e.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(i,e)}var G=function(e,t){var n=V,r=!1,i=!1;return "function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),i=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),K(e,n,r,i)};const Q={offset:0,line:1,column:1};function X(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Z(n):n:null}function Z({offset:e,line:t,column:n},r){const i={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);i.offset+=r.length,i.line+=e.length-1,i.column=1===e.length?i.column+r.length:e.pop().length+1;}return i}var $=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},J=function(e,t,n,r){const i=o("SyntaxMatchError",e),{css:a,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,i=r<n.length&&n[r].node||null,a=i!==t?i:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==a&&n[e].node===a&&(e<=r?u++:u=0),h+=t;}return r===n.length||u>1?(o=X(a||t,"end")||Z(Q,h),s=Z(o)):(o=X(a,"start")||Z(X(t,"start")||Q,h.slice(0,l)),s=X(a,"end")||Z(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return i.rawMessage=e,i.syntax=t?G(t):"<generic>",i.css=a,i.mismatchOffset=s,i.mismatchLength=l,i.message=e+"\n syntax: "+i.syntax+"\n value: "+(a||"<empty string>")+"\n --------"+new Array(i.mismatchOffset+1).join("-")+"^",Object.assign(i,c),i.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},i},ee=Object.prototype.hasOwnProperty,te=Object.create(null),ne=Object.create(null);function re(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function ie(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return ""}var ae={keyword:function(e){if(ee.call(te,e))return te[e];var t=e.toLowerCase();if(ee.call(te,t))return te[e]=te[t];var n=re(t,0),r=n?"":ie(t,0);return te[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(ee.call(ne,e))return ne[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=re(t,n.length);if(!r&&(t=t.toLowerCase(),ee.call(ne,t)))return ne[e]=ne[t];var i=r?"":ie(t,n.length),a=t.substr(0,n.length+i.length);return ne[e]=Object.freeze({basename:t.substr(a.length),name:t.substr(n.length),hack:n,vendor:i,prefix:a,custom:r})},isCustomProperty:re,vendorPrefix:ie},oe="undefined"!=typeof Uint32Array?Uint32Array:Array,se=function(e,t){return null===e||e.length<t?new oe(Math.max(t+1024,16384)):e},le=h.TYPE,ce=z.isNewline,ue=z.isName,he=z.isValidEscape,pe=z.isNumberStart,de=z.isIdentifierStart,me=z.charCodeCategory,ge=z.isBOM,fe=M.cmpStr,be=M.getNewlineLength,ye=M.findWhiteSpaceEnd,ke=M.consumeEscaped,ve=M.consumeName,xe=M.consumeNumber,we=M.consumeBadUrlRemnants;function Se(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=xe(e,h),de(n(h),n(h+1),n(h+2))?(f=le.Dimension,void(h=ve(e,h))):37===n(h)?(f=le.Percentage,void h++):void(f=le.Number)}function i(){const t=h;return h=ve(e,h),fe(e,t,h,"url")&&40===n(h)?34===n(h=ye(e,h+1))||39===n(h)?(f=le.Function,void(h=t+4)):void function(){for(f=le.Url,h=ye(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(me(t)){case 41:return void h++;case me.Eof:return;case me.WhiteSpace:return 41===n(h=ye(e,h))||h>=e.length?void(h<e.length&&h++):(h=we(e,h),void(f=le.BadUrl));case 34:case 39:case 40:case me.NonPrintable:return h=we(e,h),void(f=le.BadUrl);case 92:if(he(t,n(h+1))){h=ke(e,h)-1;break}return h=we(e,h),void(f=le.BadUrl)}}}():40===n(h)?(f=le.Function,void h++):void(f=le.Ident)}function a(t){for(t||(t=n(h++)),f=le.String;h<e.length;h++){var r=e.charCodeAt(h);switch(me(r)){case t:return void h++;case me.Eof:return;case me.WhiteSpace:if(ce(r))return h+=be(e,h,r),void(f=le.BadString);break;case 92:if(h===e.length-1)break;var i=n(h+1);ce(i)?h+=be(e,h+1,i):he(r,i)&&(h=ke(e,h)-1);}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=se(t.offsetAndType,o+1),l=se(t.balance,o+1),c=0,u=ge(n(0)),h=u,p=0,d=0,m=0;h<o;){var g=e.charCodeAt(h),f=0;switch(l[c]=o,me(g)){case me.WhiteSpace:f=le.WhiteSpace,h=ye(e,h+1);break;case 34:a();break;case 35:ue(n(h+1))||he(n(h+1),n(h+2))?(f=le.Hash,h=ve(e,h+1)):(f=le.Delim,h++);break;case 39:a();break;case 40:f=le.LeftParenthesis,h++;break;case 41:f=le.RightParenthesis,h++;break;case 43:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 44:f=le.Comma,h++;break;case 45:pe(g,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(f=le.CDC,h+=3):de(g,n(h+1),n(h+2))?i():(f=le.Delim,h++);break;case 46:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 47:42===n(h+1)?(f=le.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(f=le.Delim,h++);break;case 58:f=le.Colon,h++;break;case 59:f=le.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(f=le.CDO,h+=4):(f=le.Delim,h++);break;case 64:de(n(h+1),n(h+2),n(h+3))?(f=le.AtKeyword,h=ve(e,h+1)):(f=le.Delim,h++);break;case 91:f=le.LeftSquareBracket,h++;break;case 92:he(g,n(h+1))?i():(f=le.Delim,h++);break;case 93:f=le.RightSquareBracket,h++;break;case 123:f=le.LeftCurlyBracket,h++;break;case 125:f=le.RightCurlyBracket,h++;break;case me.Digit:r();break;case me.NameStart:i();break;case me.Eof:break;default:f=le.Delim,h++;}switch(f){case p:for(p=(d=l[m=16777215&d])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case le.LeftParenthesis:case le.Function:l[c]=d,d=(p=le.RightParenthesis)<<24|c;break;case le.LeftSquareBracket:l[c]=d,d=(p=le.RightSquareBracket)<<24|c;break;case le.LeftCurlyBracket:l[c]=d,d=(p=le.RightCurlyBracket)<<24|c;}s[c++]=f<<24|h;}for(s[c]=le.EOF<<24|h,l[c]=o,l[o]=o;0!==d;)d=l[m=16777215&d],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){Se[e]=h[e];})),Object.keys(z).forEach((function(e){Se[e]=z[e];})),Object.keys(M).forEach((function(e){Se[e]=M[e];}));var Ce=Se,ze=Ce.isDigit,Ae=Ce.cmpChar,Pe=Ce.TYPE,Te=Pe.Delim,Le=Pe.WhiteSpace,Ee=Pe.Comment,De=Pe.Ident,Oe=Pe.Number,Be=Pe.Dimension;function Ie(e,t){return null!==e&&e.type===Te&&e.value.charCodeAt(0)===t}function Ne(e,t,n){for(;null!==e&&(e.type===Le||e.type===Ee);)e=n(++t);return t}function Re(e,t,n,r){if(!e)return 0;var i=e.value.charCodeAt(t);if(43===i||45===i){if(n)return 0;t++;}for(;t<e.value.length;t++)if(!ze(e.value.charCodeAt(t)))return 0;return r+1}function Me(e,t,n){var r=!1,i=Ne(e,t,n);if(null===(e=n(i)))return t;if(e.type!==Oe){if(!Ie(e,43)&&!Ie(e,45))return t;if(r=!0,i=Ne(n(++i),i,n),null===(e=n(i))&&e.type!==Oe)return 0}if(!r){var a=e.value.charCodeAt(0);if(43!==a&&45!==a)return 0}return Re(e,r?0:1,r,i)}var je=Ce.isHexDigit,_e=Ce.cmpChar,Fe=Ce.TYPE,We=Fe.Ident,qe=Fe.Delim,Ye=Fe.Number,Ue=Fe.Dimension;function He(e,t){return null!==e&&e.type===qe&&e.value.charCodeAt(0)===t}function Ve(e,t){return e.value.charCodeAt(0)===t}function Ke(e,t,n){for(var r=t,i=0;r<e.value.length;r++){var a=e.value.charCodeAt(r);if(45===a&&n&&0!==i)return Ke(e,t+i+1,!1)>0?6:0;if(!je(a))return 0;if(++i>6)return 0}return i}function Ge(e,t,n){if(!e)return 0;for(;He(n(t),63);){if(++e>6)return 0;t++;}return t}var Qe=Ce.isIdentifierStart,Xe=Ce.isHexDigit,Ze=Ce.isDigit,$e=Ce.cmpStr,Je=Ce.consumeNumber,et=Ce.TYPE,tt=["unset","initial","inherit"],nt=["calc(","-moz-calc(","-webkit-calc("];function rt(e,t){return t<e.length?e.charCodeAt(t):0}function it(e,t){return $e(e,0,e.length,t)}function at(e,t){for(var n=0;n<t.length;n++)if(it(e,t[n]))return !0;return !1}function ot(e,t){return t===e.length-2&&(92===e.charCodeAt(t)&&Ze(e.charCodeAt(t+1)))}function st(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return !0;if(null!==e.min&&r<e.min)return !0;if(null!==e.max&&r>e.max)return !0}return !1}function lt(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ct(e){return function(t,n,r){return null===t?0:t.type===et.Function&&at(t.value,nt)?lt(t,n):e(t,n,r)}}function ut(e){return function(t){return null===t||t.type!==e?0:1}}function ht(e){return function(t,n,r){if(null===t||t.type!==et.Dimension)return 0;var i=Je(t.value,0);if(null!==e){var a=t.value.indexOf("\\",i),o=-1!==a&&ot(t.value,a)?t.value.substring(i,a):t.value.substr(i);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return st(r,t.value,i)?0:1}}function pt(e){return "function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===et.Number&&0===Number(t.value)?1:e(t,n,r)}}var dt,mt={"ident-token":ut(et.Ident),"function-token":ut(et.Function),"at-keyword-token":ut(et.AtKeyword),"hash-token":ut(et.Hash),"string-token":ut(et.String),"bad-string-token":ut(et.BadString),"url-token":ut(et.Url),"bad-url-token":ut(et.BadUrl),"delim-token":ut(et.Delim),"number-token":ut(et.Number),"percentage-token":ut(et.Percentage),"dimension-token":ut(et.Dimension),"whitespace-token":ut(et.WhiteSpace),"CDO-token":ut(et.CDO),"CDC-token":ut(et.CDC),"colon-token":ut(et.Colon),"semicolon-token":ut(et.Semicolon),"comma-token":ut(et.Comma),"[-token":ut(et.LeftSquareBracket),"]-token":ut(et.RightSquareBracket),"(-token":ut(et.LeftParenthesis),")-token":ut(et.RightParenthesis),"{-token":ut(et.LeftCurlyBracket),"}-token":ut(et.RightCurlyBracket),string:ut(et.String),ident:ut(et.Ident),"custom-ident":function(e){if(null===e||e.type!==et.Ident)return 0;var t=e.value.toLowerCase();return at(t,tt)||it(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==et.Ident||45!==rt(e.value,0)||45!==rt(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==et.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Xe(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==et.Hash?0:Qe(rt(e.value,1),rt(e.value,2),rt(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Oe)return Re(e,0,!1,n);if(e.type===De&&45===e.value.charCodeAt(0)){if(!Ae(e.value,1,110))return 0;switch(e.value.length){case 2:return Me(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Re(e,3,!0,n)}}else if(e.type===De||Ie(e,43)&&t(n+1).type===De){if(e.type!==De&&(e=t(++n)),null===e||!Ae(e.value,0,110))return 0;switch(e.value.length){case 1:return Me(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Re(e,2,!0,n)}}else if(e.type===Be){for(var r=e.value.charCodeAt(0),i=43===r||45===r?1:0,a=i;a<e.value.length&&ze(e.value.charCodeAt(a));a++);return a===i?0:Ae(e.value,a,110)?a+1===e.value.length?Me(t(++n),n,t):45!==e.value.charCodeAt(a+1)?0:a+2===e.value.length?(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n)):Re(e,a+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==We||!_e(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(He(e,43))return null===(e=t(++n))?0:e.type===We?Ge(Ke(e,0,!0),++n,t):He(e,63)?Ge(1,++n,t):0;if(e.type===Ye){if(!Ve(e,43))return 0;var r=Ke(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===Ue||e.type===Ye?Ve(e,45)&&Ke(e,1,!1)?n+1:0:Ge(r,n,t)}return e.type===Ue&&Ve(e,43)?Ge(Ke(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,i=e.index;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<i)break e;r--;break;case et.Semicolon:if(0===r)break e;break;case et.Delim:if("!"===e.value&&0===r)break e;break;case et.Function:case et.LeftParenthesis:case et.LeftSquareBracket:case et.LeftCurlyBracket:r++;}if(n++,e.balance<=i)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ct(ht(null)),angle:ct(ht({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ct(ht({db:!0})),frequency:ct(ht({hz:!0,khz:!0})),flex:ct(ht({fr:!0})),length:ct(pt(ht({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ct(ht({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ct(ht({st:!0})),time:ct(ht({s:!0,ms:!0})),percentage:ct((function(e,t,n){return null===e||e.type!==et.Percentage||st(n,e.value,e.value.length-1)?0:1})),zero:pt(),number:ct((function(e,t,n){if(null===e)return 0;var r=Je(e.value,0);return r===e.value.length||ot(e.value,r)?st(n,e.value,r)?0:1:0})),integer:ct((function(e,t,n){if(null===e||e.type!==et.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ze(e.value.charCodeAt(r)))return 0;return st(n,e.value,r)?0:1})),"-ms-legacy-expression":(dt="expression",dt+="(",function(e,t){return null!==e&&it(e.value,dt)?lt(e,t):0})},gt=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},ft=function(e){this.str=e,this.pos=0;};ft.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++;},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new gt(e,this.str,this.pos)}};var bt=ft,yt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return /[a-zA-Z0-9\-]/.test(e)})),kt={" ":1,"&&":2,"||":3,"|":4};function vt(e){return e.substringToPos(e.findWsEnd(e.pos))}function xt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===yt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function wt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function St(e){var t=e.str.indexOf("'",e.pos+1);return -1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Ct(e){var t,n=null;return e.eat(123),t=wt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=wt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function zt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?Ct(e):{min:1,max:0};break;case 123:t=Ct(e);break;default:return null}return {type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function At(e){var t=e.peek();return ""===t?null:{type:"Token",value:t}}function Pt(e){var t,n=null;return e.eat(60),t=xt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(vt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(wt(e)),vt(e),e.eat(44),vt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(wt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),zt(e,{type:"Type",name:t,opts:n})}function Tt(e,t){function n(e,t){return {type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return kt[e]-kt[t]}));t.length>0;){for(var r=t.shift(),i=0,a=0;i<e.length;i++){var o=e[i];"Combinator"===o.type&&(o.value===r?(-1===a&&(a=i-1),e.splice(i,1),i--):(-1!==a&&i-a>1&&(e.splice(a,i-a,n(e.slice(a,i),r)),i=a+1),a=-1));}-1!==a&&t.length&&e.splice(a,i-a,n(e.slice(a,i),r));}return r}function Lt(e){for(var t,n=[],r={},i=null,a=e.pos;t=Et(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==i&&"Combinator"!==i.type||(e.pos=a,e.error("Unexpected combinator")),r[t.value]=!0):null!==i&&"Combinator"!==i.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),i=t,a=e.pos);return null!==i&&"Combinator"===i.type&&(e.pos-=a,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:Tt(n,r)||" ",disallowEmpty:!1,explicit:!1}}function Et(e){var t=e.charCode();if(t<128&&1===yt[t])return function(e){var t;return t=xt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):zt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return zt(e,function(e){var t;return e.eat(91),t=Lt(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=xt(e),e.eat(39),e.eat(62),zt(e,{type:"Property",name:t})}(e):Pt(e);case 124:return {type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return zt(e,{type:"String",value:St(e)});case 32:case 9:case 10:case 13:case 12:return {type:"Spaces",value:vt(e)};case 64:return (t=e.nextCharCode())<128&&1===yt[t]?(e.pos++,{type:"AtKeyword",name:xt(e)}):At(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return At(e);break;default:return At(e)}}function Dt(e){var t=new bt(e),n=Lt(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}Dt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Ot=Dt,Bt=function(){};function It(e){return "function"==typeof e?e:Bt}var Nt=function(e,t,n){var r=Bt,i=Bt;if("function"==typeof t?r=t:t&&(r=It(t.enter),i=It(t.leave)),r===Bt&&i===Bt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}i.call(n,t);}(e);},Rt=new H,Mt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],i="";return {children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r;},chunk:function(e){i+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length;},result:function(){return jt(i,r)}}}};function jt(e,t){var n=[],r=0,i=0,a=t?t[i].node:null;for(Ce(e,Rt);!Rt.eof;){if(t)for(;i<t.length&&r+t[i].len<=Rt.tokenStart;)r+=t[i++].len,a=t[i].node;n.push({type:Rt.tokenType,value:Rt.getTokenValue(),index:Rt.tokenIndex,balance:Rt.balance[Rt.tokenIndex],node:a}),Rt.next();}return n}var _t={type:"Match"},Ft={type:"Mismatch"},Wt={type:"DisallowEmpty"};function qt(e,t,n){return t===_t&&n===Ft||e===_t&&t===_t&&n===_t?e:("If"===e.type&&e.else===Ft&&t===_t&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function Yt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function Ut(e){return "Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&Yt(e.name)}function Ht(e){if("function"==typeof e)return {type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var i=_t,a=n.length-1;a>=0;a--){i=qt(l=n[a],i,Ft);}return i;case"|":i=Ft;var o=null;for(a=n.length-1;a>=0;a--){if(Ut(l=n[a])&&(null===o&&a>0&&Ut(n[a-1])&&(i=qt({type:"Enum",map:o=Object.create(null)},_t,i)),null!==o)){var s=(Yt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==!1){o[s]=l;continue}}o=null,i=qt(l,_t,i);}return i;case"&&":if(n.length>5)return {type:"MatchOnce",terms:n,all:!0};for(i=Ft,a=n.length-1;a>=0;a--){var l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):_t,i=qt(l,c,i);}return i;case"||":if(n.length>5)return {type:"MatchOnce",terms:n,all:!1};for(i=r?_t:Ft,a=n.length-1;a>=0;a--){var c;l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):_t,i=qt(l,c,i);}return i}}(e.combinator,e.terms.map(Ht),!1);return e.disallowEmpty&&(t=qt(t,Wt,Ft)),t;case"Multiplier":return function(e){var t=_t,n=Ht(e.term);if(0===e.max)n=qt(n,Wt,Ft),(t=qt(n,null,Ft)).then=qt(_t,_t,t),e.comma&&(t.then.else=qt({type:"Comma",syntax:e},t,Ft));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,qt(_t,_t,t),Ft);if(0===e.min)t=qt(_t,_t,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,t,Ft);return t}(e);case"Type":case"Property":return {type:e.type,name:e.name,syntax:e};case"Keyword":return {type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return {type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return {type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return {type:e.type,value:e.value,syntax:e};case"Comma":return {type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Vt=_t,Kt=Ft,Gt=Wt,Qt=function(e,t){return "string"==typeof e&&(e=Ot(e)),{type:"MatchGraph",match:Ht(e),syntax:t||null,source:e}},Xt=Object.prototype.hasOwnProperty,Zt=Vt,$t=Kt,Jt=Gt,en=h.TYPE;function tn(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}function nn(e,t){if(e.length!==t.length)return !1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return !1}return !0}function rn(e){return null===e||(e.type===en.Comma||e.type===en.Function||e.type===en.LeftParenthesis||e.type===en.LeftSquareBracket||e.type===en.LeftCurlyBracket||function(e){return e.type===en.Delim&&"?"!==e.value}(e))}function an(e){return null===e||(e.type===en.RightParenthesis||e.type===en.RightSquareBracket||e.type===en.RightCurlyBracket||e.type===en.Delim)}function on(e,t,n){function r(){do{b++,f=b<e.length?e[b]:null;}while(null!==f&&(f.type===en.WhiteSpace||f.type===en.Comment))}function i(t){var n=b+t;return n<e.length?e[n]:null}function a(e,t){return {nextState:e,matchStack:k,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:k,syntaxStack:u,prev:h};}function s(e){p=a(e,p);}function l(){k={type:1,syntax:t.syntax,token:f,prev:k},r(),d=null,b>y&&(y=b);}function c(){k=2===k.type?k.prev:{type:3,syntax:u.syntax,token:k.token,prev:k},u=u.prev;}var u=null,h=null,p=null,d=null,m=0,g=null,f=null,b=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(r();null===g&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==f&&(b!==e.length-1||"\\0"!==f.value&&"\\9"!==f.value)){t=$t;break}g="Match";break}if((t=h.nextState)===Jt){if(h.matchStack===k){t=$t;break}t=Zt;}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==d&&!1!==d)(null===p||b>p.tokenIndex)&&(p=d,d=!1);else if(null===p){g="Mismatch";break}t=p.nextState,h=p.thenStack,u=p.syntaxStack,k=p.matchStack,b=p.tokenIndex,f=b<e.length?e[b]:null,p=p.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==$t&&s(t.else),t.then!==Zt&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var v=t.syntax.terms;if(t.index===v.length){if(0===t.mask||t.syntax.all){t=$t;break}t=Zt;break}if(t.mask===(1<<v.length)-1){t=Zt;break}for(;t.index<v.length;t.index++){var x=1<<t.index;if(0==(t.mask&x)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|x}),t=v[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==f)if(-1!==(A=f.value.toLowerCase()).indexOf("\\")&&(A=A.replace(/\\[09].*$/,"")),Xt.call(t.map,A)){t=t.map[A];break}t=$t;break;case"Generic":var w=null!==u?u.opts:null,S=b+Math.floor(t.fn(f,i,w));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Zt;}else t=$t;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",z=Xt.call(n,C)?n[C][t.name]:null;if(!z||!z.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==d&&null!==f&&"Type"===t.type)if("custom-ident"===t.name&&f.type===en.Ident||"length"===t.name&&"0"===f.value){null===d&&(d=a(t,p)),t=$t;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},k={type:2,syntax:t.syntax,token:k.token,prev:k},t=z.match;break;case"Keyword":var A=t.name;if(null!==f){var P=f.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),nn(P,A)){l(),t=Zt;break}}t=$t;break;case"AtKeyword":case"Function":if(null!==f&&nn(f.value,t.name)){l(),t=Zt;break}t=$t;break;case"Token":if(null!==f&&f.value===t.value){l(),t=Zt;break}t=$t;break;case"Comma":null!==f&&f.type===en.Comma?rn(k.token)?t=$t:(l(),t=an(f)?$t:Zt):t=rn(k.token)||an(f)?Zt:$t;break;case"String":var T="";for(S=b;S<e.length&&T.length<t.value.length;S++)T+=e[S].value;if(nn(T,t.value)){for(;b<S;)l();t=Zt;}else t=$t;break;default:throw new Error("Unknown node type: "+t.type)}switch(g){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),g="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",k=null;break;case"Match":for(;null!==u;)c();break;default:k=null;}return {tokens:e,reason:g,iterations:m,match:k,longestMatch:y}}var sn=function(e,t,n){var r=on(e,t,n||{});if(null===r.match)return r;var i=r.match,a=r.match={syntax:t.syntax||null,match:[]},o=[a];for(i=tn(i).prev;null!==i;){switch(i.type){case 2:a.match.push(a={syntax:i.syntax,match:[]}),o.push(a);break;case 3:o.pop(),a=o[o.length-1];break;default:a.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node});}i=i.prev;}return r};function ln(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(i){if(Array.isArray(i.match)){for(var a=0;a<i.match.length;a++)if(r(i.match[a]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return !1}(this.matched),n}function cn(e,t,n){var r=ln.call(e,t);return null!==r&&r.some(n)}var un={getTrace:ln,isType:function(e,t){return cn(this,e,(function(e){return "Type"===e.type&&e.name===t}))},isProperty:function(e,t){return cn(this,e,(function(e){return "Property"===e.type&&e.name===t}))},isKeyword:function(e){return cn(this,e,(function(e){return "Keyword"===e.type}))}};var hn={matchFragments:function(e,t,n,r,i){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===i){var l=function e(t){return "node"in t?t.node:e(t.match[0])}(s),c=function e(t){return "node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new a;do{if(r.appendData(t.data),t.data===c)break;t=t.next;}while(null!==t);o.push({parent:n,nodes:r});}}));}Array.isArray(s.match)&&s.match.forEach(n);}(n.matched),o}},pn=Object.prototype.hasOwnProperty;function dn(e){return "number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function mn(e){return Boolean(e)&&dn(e.offset)&&dn(e.line)&&dn(e.column)}function gn(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var i in n){var o=!0;if(!1!==pn.call(n,i)){if("type"===i)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===i){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)i+=".source";else if(mn(n.loc.start)){if(mn(n.loc.end))continue;i+=".end";}else i+=".start";o=!1;}else if(t.hasOwnProperty(i)){var s=0;for(o=!1;!o&&s<t[i].length;s++){var l=t[i][s];switch(l){case String:o="string"==typeof n[i];break;case Boolean:o="boolean"==typeof n[i];break;case null:o=null===n[i];break;default:"string"==typeof l?o=n[i]&&n[i].type===l:Array.isArray(l)&&(o=n[i]instanceof a);}}}else r(n,"Unknown field `"+i+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+i+"`");}}for(var i in t)pn.call(t,i)&&!1===pn.call(n,i)&&r(n,"Field `"+e+"."+i+"` is missed");}}function fn(e,t){var n=t.structure,r={type:String,loc:!0},i={type:'"'+e+'"'};for(var a in n)if(!1!==pn.call(n,a)){for(var o=[],s=r[a]=Array.isArray(n[a])?n[a].slice():[n[a]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else {if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+a+"` structure definition");o.push("List");}}i[a]=o.join(" | ");}return {docs:i,check:gn(e,r)}}var bn=$,yn=J,kn=Qt,vn=sn,xn=function(e){var t={};if(e.node)for(var n in e.node)if(pn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=fn(n,r);}return t},wn=kn("inherit | initial | unset"),Sn=kn("inherit | initial | unset | <-ms-legacy-expression>");function Cn(e,t,n){var r={};for(var i in e)e[i].syntax&&(r[i]=n?e[i].syntax:G(e[i].syntax,{compact:t}));return r}function zn(e,t,n){const r={};for(const[i,a]of Object.entries(e))r[i]={prelude:a.prelude&&(n?a.prelude.syntax:G(a.prelude.syntax,{compact:t})),descriptors:a.descriptors&&Cn(a.descriptors,t,n)};return r}function An(e,t,n){return {matched:e,iterations:n,error:t,getTrace:un.getTrace,isType:un.isType,isProperty:un.isProperty,isKeyword:un.isKeyword}}function Pn(e,t,n,r){var i,a=function(e,t){return "string"==typeof e?jt(e,null):t.generate(e,Mt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return !0;return !1}(a)?An(null,new Error("Matching for a tree with var() is not supported")):(r&&(i=vn(a,e.valueCommonSyntax,e)),r&&i.match||(i=vn(a,t.match,e)).match?An(i.match,null,i.iterations):An(null,new yn(i.reason,t.syntax,n,i),i.iterations))}var Tn=function(e,t,n){if(this.valueCommonSyntax=wn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||xn(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,mt)this.addType_(r,mt[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r]);}};Tn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t});}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`");})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var i={type:t,name:n},a={type:t,name:n,parent:r,syntax:null,match:null};return "function"==typeof e?a.match=kn(e,i):("string"==typeof e?Object.defineProperty(a,"syntax",{get:function(){return Object.defineProperty(a,"syntax",{value:Ot(e)}),a.syntax}}):a.syntax=e,Object.defineProperty(a,"match",{get:function(){return Object.defineProperty(a,"match",{value:kn(a.syntax,i)}),a.match}})),a},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null});},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e));},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===mt["-ms-legacy-expression"]&&(this.valueCommonSyntax=Sn));},checkAtruleName:function(e){if(!this.getAtrule(e))return new bn("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return !r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),i=ae.keyword(t);return r.descriptors?r.descriptors[i.name]||r.descriptors[i.basename]?void 0:new bn("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ae.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new bn("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?An(null,n):t?Pn(this,this.getAtrule(e).prelude,t,!0):An(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return An(null,r);var i=this.getAtrule(e),a=ae.keyword(t);return Pn(this,i.descriptors[a.name]||i.descriptors[a.basename],n,!0)},matchDeclaration:function(e){return "Declaration"!==e.type?An(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?An(null,n):Pn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?Pn(this,n,t,!1):An(null,new bn("Unknown type",e))},match:function(e,t){return "string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),Pn(this,e,t,!1)):An(null,new bn("Bad syntax"))},findValueFragments:function(e,t,n,r){return hn.matchFragments(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return hn.matchFragments(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n));}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ae.keyword(e);return (n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ae.property(e);return (n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,i,a,o){if(a.hasOwnProperty(i))return a[i];a[i]=!1,null!==o.syntax&&Nt(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(a[i]=!0);}}),this);}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return {generic:this.generic,types:Cn(this.types,!t,e),properties:Cn(this.properties,!t,e),atrules:zn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var Ln=Tn,En={SyntaxError:gt,parse:Ot,generate:G,walk:Nt},Dn=Ce.isBOM;var On=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1;};On.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1;},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(!function(e,t){for(var n=t.length,r=se(e.lines,n),i=e.startLine,a=se(e.columns,n),o=e.startColumn,s=t.length>0?Dn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=i,a[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=i,a[s]=o),i++,o=1);}r[s]=i,a[s]=o,e.lines=r,e.columns=a;}(this,this.source),this.linesAndColumnsComputed=!0);},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Bn=On,In=Ce.TYPE,Nn=In.WhiteSpace,Rn=In.Comment,Mn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case Rn:this.scanner.next();continue;case Nn:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1;}return t},{findWhiteSpaceStart:jn,cmpStr:_n}=M,Fn=function(){},Wn=h.TYPE,qn=h.NAME,Yn=Wn.WhiteSpace,Un=Wn.Comment,Hn=Wn.Ident,Vn=Wn.Function,Kn=Wn.Url,Gn=Wn.Hash,Qn=Wn.Percentage,Xn=Wn.Number;function Zn(e){return function(){return this[e]()}}var $n=function(e){var t={scanner:new H,locationMap:new Bn,filename:"<unknown>",needPositions:!1,onParseError:Fn,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Mn,createList:function(){return new a},createSingleNodeList:function(e){return (new a).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==Yn)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=qn[e]+" is expected";switch(e){case Hn:this.scanner.tokenType===Vn||this.scanner.tokenType===Kn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case Gn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case Qn:this.scanner.tokenType===Xn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1);}this.error(n,t);}this.scanner.next();},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Vn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(jn(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Zn(e.parseContext[n]);}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse);}if(e.pseudo)for(var n in e.pseudo){var i=e.pseudo[n];i.parse&&(t.pseudo[n]=i.parse);}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,i=(n=n||{}).context||"default",a=n.onComment;if(Ce(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:Fn,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(i))throw new Error("Unknown context `"+i+"`");return "function"==typeof a&&t.scanner.forEachToken((n,r,i)=>{if(n===Un){const n=t.getLocation(r,i),o=_n(e,i-2,i,"*/")?e.slice(r+2,i-2):e.slice(r+2,i);a(o,n);}}),r=t.context[i].call(t,n),t.scanner.eof||t.error(),r}},Jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),er=function(e){if(0<=e&&e<Jn.length)return Jn[e];throw new TypeError("Must be between 0 and 63: "+e)};var tr=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=er(t);}while(r>0);return n};var nr=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function a(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path;}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return ""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,a(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),s=i(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),a(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,a(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,a(s)):l}t.urlParse=i,t.urlGenerate=a,t.normalize=o,t.join=s,t.isAbsolute=function(e){return "/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n;}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return !1;var t=e.length;if(t<9)return !1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return !1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return !1;return !0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=i(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1));}t=s(a(r),t);}return o(t)};})),rr=(nr.getArg,nr.urlParse,nr.urlGenerate,nr.normalize,nr.join,nr.isAbsolute,nr.relative,nr.toSetString,nr.fromSetString,nr.compareByOriginalPositions,nr.compareByGeneratedPositionsDeflated,nr.compareByGeneratedPositionsInflated,nr.parseSourceMapInput,nr.computeSourceURL,Object.prototype.hasOwnProperty),ir="undefined"!=typeof Map;function ar(){this._array=[],this._set=ir?new Map:Object.create(null);}ar.fromArray=function(e,t){for(var n=new ar,r=0,i=e.length;r<i;r++)n.add(e[r],t);return n},ar.prototype.size=function(){return ir?this._set.size:Object.getOwnPropertyNames(this._set).length},ar.prototype.add=function(e,t){var n=ir?e:nr.toSetString(e),r=ir?this.has(e):rr.call(this._set,n),i=this._array.length;r&&!t||this._array.push(e),r||(ir?this._set.set(e,i):this._set[n]=i);},ar.prototype.has=function(e){if(ir)return this._set.has(e);var t=nr.toSetString(e);return rr.call(this._set,t)},ar.prototype.indexOf=function(e){if(ir){var t=this._set.get(e);if(t>=0)return t}else {var n=nr.toSetString(e);if(rr.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},ar.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},ar.prototype.toArray=function(){return this._array.slice()};var or={ArraySet:ar};function sr(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0};}sr.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t);},sr.prototype.add=function(e){var t,n,r,i,a,o;t=this._last,n=e,r=t.generatedLine,i=n.generatedLine,a=t.generatedColumn,o=n.generatedColumn,i>r||i==r&&o>=a||nr.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e));},sr.prototype.toArray=function(){return this._sorted||(this._array.sort(nr.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var lr=or.ArraySet,cr={MappingList:sr}.MappingList;function ur(e){e||(e={}),this._file=nr.getArg(e,"file",null),this._sourceRoot=nr.getArg(e,"sourceRoot",null),this._skipValidation=nr.getArg(e,"skipValidation",!1),this._sources=new lr,this._names=new lr,this._mappings=new cr,this._sourcesContents=null;}ur.prototype._version=3,ur.fromSourceMap=function(e){var t=e.sourceRoot,n=new ur({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=nr.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r);})),e.sources.forEach((function(r){var i=r;null!==t&&(i=nr.relative(t,r)),n._sources.has(i)||n._sources.add(i);var a=e.sourceContentFor(r);null!=a&&n.setSourceContent(r,a);})),n},ur.prototype.addMapping=function(e){var t=nr.getArg(e,"generated"),n=nr.getArg(e,"original",null),r=nr.getArg(e,"source",null),i=nr.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:i});},ur.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=nr.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[nr.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[nr.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null));},ur.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file;}var i=this._sourceRoot;null!=i&&(r=nr.relative(i,r));var a=new lr,o=new lr;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=nr.join(n,t.source)),null!=i&&(t.source=nr.relative(i,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name));}var l=t.source;null==l||a.has(l)||a.add(l);var c=t.name;null==c||o.has(c)||o.add(c);}),this),this._sources=a,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=nr.join(n,t)),null!=i&&(t=nr.relative(i,t)),this.setSourceContent(t,r));}),this);},ur.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},ur.prototype._serializeMappings=function(){for(var e,t,n,r,i=0,a=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),p=0,d=h.length;p<d;p++){if(e="",(t=h[p]).generatedLine!==a)for(i=0;t.generatedLine!==a;)e+=";",a++;else if(p>0){if(!nr.compareByGeneratedPositionsInflated(t,h[p-1]))continue;e+=",";}e+=tr(t.generatedColumn-i),i=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=tr(r-c),c=r,e+=tr(t.originalLine-1-s),s=t.originalLine-1,e+=tr(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=tr(n-l),l=n)),u+=e;}return u},ur.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=nr.relative(t,e));var n=nr.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},ur.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},ur.prototype.toString=function(){return JSON.stringify(this.toJSON())};var hr={SourceMapGenerator:ur}.SourceMapGenerator,pr={Atrule:!0,Selector:!0,Declaration:!0},dr=Object.prototype.hasOwnProperty;function mr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e;}),this);}var gr=function(e){function t(e){if(!dr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e);}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",i={children:mr,node:t,chunk:function(e){r+=e;},result:function(){return r}};return n&&("function"==typeof n.decorator&&(i=n.decorator(i)),n.sourceMap&&(i=function(e){var t=new hr,n=1,r=0,i={line:1,column:0},a={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&pr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;a.line===u&&a.column===h||(a.line=u,a.column=h,i.line=n,i.column=r,o&&(o=!1,i.line===s.line&&i.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:a,generated:i}));}c.call(this,e),o&&pr.hasOwnProperty(e.type)&&(s.line=n,s.column=r);};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e);};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(i))),i.node(e),i.result()}},fr=Object.prototype.hasOwnProperty,br=function(){};function yr(e){return "function"==typeof e?e:br}function kr(e,t){return function(n,r,i){n.type===t&&e.call(this,n,r,i);}}function vr(e,t){var n=t.structure,r=[];for(var i in n)if(!1!==fr.call(n,i)){var a=n[i],o={name:i,type:!1,nullable:!1};Array.isArray(n[i])||(a=[n[i]]);for(var s=0;s<a.length;s++){var l=a[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list");}o.type&&r.push(o);}return r.length?{context:t.walkContext,fields:r}:null}function xr(e,t){var n=e.fields.slice(),r=e.context,i="string"==typeof r;return t&&n.reverse(),function(e,a,o,s){var l;i&&(l=a[r],a[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return !0}else if(o(h))return !0}i&&(a[r]=l);}}function wr(e){return {Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var Sr=function(e){var t=function(e){var t={};for(var n in e.node)if(fr.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=vr(0,r);}return t}(e),n={},r={},i=Symbol("break-walk"),a=Symbol("skip-node");for(var o in t)fr.call(t,o)&&null!==t[o]&&(n[o]=xr(t[o],!1),r[o]=xr(t[o],!0));var s=wr(n),l=wr(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===i||r!==a&&(!(!d.hasOwnProperty(e.type)||!d[e.type](e,m,c,u))||p.call(m,e,t,n)===i)}var u=(e,t,n,r)=>e||c(t,n,r),h=br,p=br,d=n,m={break:i,skip:a,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=yr(o.enter),p=yr(o.leave),o.reverse&&(d=r),o.visit)){if(s.hasOwnProperty(o.visit))d=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=kr(h,o.visit),p=kr(p,o.visit);}if(h===br&&p===br)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e);};return c.break=i,c.skip=a,c.find=function(e,t){var n=null;return c(e,(function(e,r,a){if(t.call(this,e,r,a))return n=e,i})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,a){if(t.call(this,e,r,a))return n=e,i}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,i){t.call(this,e,r,i)&&n.push(e);})),n},c},Cr=function e(t){var n={};for(var r in t){var i=t[r];i&&(Array.isArray(i)||i instanceof a?i=i.map(e):i.constructor===Object&&(i=e(i))),n[r]=i;}return n};const zr=Object.prototype.hasOwnProperty,Ar={generic:!0,types:Er,atrules:{prelude:Dr,descriptors:Dr},properties:Er,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)zr.call(n,r)&&(Pr(t[r])?e(t[r],Tr(n[r])):t[r]=Tr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function Pr(e){return e&&e.constructor===Object}function Tr(e){return Pr(e)?Object.assign({},e):e}function Lr(e,t){return "string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function Er(e,t){if("string"==typeof t)return Lr(e,t);const n=Object.assign({},e);for(let r in t)zr.call(t,r)&&(n[r]=Lr(zr.call(e,r)?e[r]:void 0,t[r]));return n}function Dr(e,t){const n=Er(e,t);return !Pr(n)||Object.keys(n).length?n:null}var Or=(e,t)=>function e(t,n,r){for(const i in r)if(!1!==zr.call(r,i))if(!0===r[i])i in n&&zr.call(n,i)&&(t[i]=Tr(n[i]));else if(r[i])if("function"==typeof r[i]){const e=r[i];t[i]=e({},t[i]),t[i]=e(t[i]||{},n[i]);}else if(Pr(r[i])){const a={};for(let n in t[i])a[n]=e({},t[i][n],r[i]);for(let t in n[i])a[t]=e(a[t]||{},n[i][t],r[i]);t[i]=a;}else if(Array.isArray(r[i])){const a={},o=r[i].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[i]||{}))a[n]={},r&&e(a[n],r,o);for(const t in n[i])zr.call(n[i],t)&&(a[t]||(a[t]={}),n[i]&&n[i][t]&&e(a[t],n[i][t],o));t[i]=a;}return t}(e,t,Ar);function Br(e){var t=$n(e),n=Sr(e),r=gr(e),i=function(e){return {fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof a==!1&&(e.children=(new a).fromArray(e.children));}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof a&&(e.children=e.children.toArray());}}),t}}}(n),o={List:a,SyntaxError:l,TokenStream:H,Lexer:Ln,vendorPrefix:ae.vendorPrefix,keyword:ae.keyword,property:ae.property,isCustomProperty:ae.isCustomProperty,definitionSyntax:En,lexer:null,createLexer:function(e){return new Ln(e,o,o.lexer.structure)},tokenize:Ce,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:Cr,fromPlainObject:i.fromPlainObject,toPlainObject:i.toPlainObject,createSyntax:function(e){return Br(Or({},e))},fork:function(t){var n=Or({},e);return Br("function"==typeof t?t(n,Object.assign):Or(n,t))}};return o.lexer=new Ln({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var Ir=function(e){return Br(Or({},e))},Nr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},Rr=Ce.cmpChar,Mr=Ce.isDigit,jr=Ce.TYPE,_r=jr.WhiteSpace,Fr=jr.Comment,Wr=jr.Ident,qr=jr.Number,Yr=jr.Dimension;function Ur(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Mr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n);}function Hr(e){return Ur.call(this,0,e)}function Vr(e,t){if(!Rr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected";}this.error(n,this.scanner.tokenStart+e);}}function Kr(){for(var e=0,t=0,n=this.scanner.tokenType;n===_r||n===Fr;)n=this.scanner.lookupType(++e);if(n!==qr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e);}while(n===_r||n===Fr);n!==qr&&(this.scanner.skip(e),Hr.call(this,!0));}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Hr.call(this,0!==t),45===t?"-"+this.consume(qr):this.consume(qr)}var Gr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===qr)Hr.call(this,!1),n=this.consume(qr);else if(this.scanner.tokenType===Wr&&Rr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Vr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Kr.call(this);break;case 3:Vr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,2,45),Ur.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2);}else if(this.scanner.tokenType===Wr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Wr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Vr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Kr.call(this);break;case 2:Vr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,1,45),Ur.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1);}}else if(this.scanner.tokenType===Yr){for(var i=this.scanner.source.charCodeAt(this.scanner.tokenStart),a=(r=43===i||45===i,this.scanner.tokenStart+r);a<this.scanner.tokenEnd&&Mr(this.scanner.source.charCodeAt(a));a++);a===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Vr.call(this,a-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,a),a+1===this.scanner.tokenEnd?(this.scanner.next(),n=Kr.call(this)):(Vr.call(this,a-this.scanner.tokenStart+1,45),a+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr)):(Ur.call(this,a-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(a+1)));}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b));}},Qr=Ce.TYPE,Xr=Qr.WhiteSpace,Zr=Qr.Semicolon,$r=Qr.LeftCurlyBracket,Jr=Qr.Delim;function ei(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Xr?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function ti(){return 0}var ni={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,i=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||ti)),r=n&&this.scanner.tokenStart>i?ei.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(i,r),value:this.scanner.source.substring(i,r)}},generate:function(e){this.chunk(e.value);},mode:{default:ti,leftCurlyBracket:function(e){return e===$r?1:0},leftCurlyBracketOrSemicolon:function(e){return e===$r||e===Zr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===Jr&&33===t.charCodeAt(n)||e===Zr?1:0},semicolonIncluded:function(e){return e===Zr?2:0}}},ri=Ce.TYPE,ii=ni.mode,ai=ri.AtKeyword,oi=ri.Semicolon,si=ri.LeftCurlyBracket,li=ri.RightCurlyBracket;function ci(e){return this.Raw(e,ii.leftCurlyBracketOrSemicolon,!0)}function ui(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===li)return !0;if(e===si||e===ai)return !1}return !1}var hi={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,i=null;switch(this.eat(ai),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==si&&this.scanner.tokenType!==oi&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),ci)).type&&null===r.children.head&&(r=null):r=ci.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case oi:this.scanner.next();break;case si:i=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(ui.call(this));}return {type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:i}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";");},walkContext:"atrule"},pi=Ce.TYPE,di=pi.Semicolon,mi=pi.LeftCurlyBracket,gi={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==mi&&this.scanner.tokenType!==di&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e);},walkContext:"atrulePrelude"},fi=Ce.TYPE,bi=fi.Ident,yi=fi.String,ki=fi.Colon,vi=fi.LeftSquareBracket,xi=fi.RightSquareBracket;function wi(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(bi),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(bi)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ki&&(this.scanner.next(),this.eat(bi)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function Si(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var Ci={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,i=null;return this.eat(vi),this.scanner.skipSC(),e=wi.call(this),this.scanner.skipSC(),this.scanner.tokenType!==xi&&(this.scanner.tokenType!==bi&&(n=Si.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===yi?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===bi&&(i=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(xi),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:i}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]");}},zi=Ce.TYPE,Ai=ni.mode,Pi=zi.WhiteSpace,Ti=zi.Comment,Li=zi.Semicolon,Ei=zi.AtKeyword,Di=zi.LeftCurlyBracket,Oi=zi.RightCurlyBracket;function Bi(e){return this.Raw(e,null,!0)}function Ii(){return this.parseWithFallback(this.Rule,Bi)}function Ni(e){return this.Raw(e,Ai.semicolonIncluded,!0)}function Ri(){if(this.scanner.tokenType===Li)return Ni.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,Ni);return this.scanner.tokenType===Li&&this.scanner.next(),e}var Mi={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?Ri:Ii,n=this.scanner.tokenStart,r=this.createList();this.eat(Di);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case Oi:break e;case Pi:case Ti:this.scanner.next();break;case Ei:r.push(this.parseWithFallback(this.Atrule,Bi));break;default:r.push(t.call(this));}return this.scanner.eof||this.eat(Oi),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";");})),this.chunk("}");},walkContext:"block"},ji=Ce.TYPE,_i=ji.LeftSquareBracket,Fi=ji.RightSquareBracket,Wi={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(_i),n=e.call(this,t),this.scanner.eof||this.eat(Fi),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]");}},qi=Ce.TYPE.CDC,Yi={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(qi),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e");}},Ui=Ce.TYPE.CDO,Hi={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ui),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--");}},Vi=Ce.TYPE.Ident,Ki={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Vi)}},generate:function(e){this.chunk("."),this.chunk(e.name);}},Gi=Ce.TYPE.Ident,Qi={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Gi&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected");}return {type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name);}},Xi=Ce.TYPE.Comment,Zi={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Xi),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/");}},$i=ae.isCustomProperty,Ji=Ce.TYPE,ea=ni.mode,ta=Ji.Ident,na=Ji.Hash,ra=Ji.Colon,ia=Ji.Semicolon,aa=Ji.Delim,oa=Ji.WhiteSpace;function sa(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!0)}function la(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!1)}function ca(){var e=this.scanner.tokenIndex,t=this.Value();return "Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var ua={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=ha.call(this),i=$i(r),a=i?this.parseCustomProperty:this.parseValue,o=i?la:sa,s=!1;this.scanner.skipSC(),this.eat(ra);const l=this.scanner.tokenIndex;if(i||this.scanner.skipSC(),e=a?this.parseWithFallback(ca,o):o.call(this,this.scanner.tokenIndex),i&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===oa){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=pa.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important);},walkContext:"declaration"};function ha(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===aa)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next();}return this.scanner.tokenType===na?this.eat(na):this.eat(ta),this.scanner.substrToCursor(e)}function pa(){this.eat(aa),this.scanner.skipSC();var e=this.consume(ta);return "important"===e||e}var da=Ce.TYPE,ma=ni.mode,ga=da.WhiteSpace,fa=da.Comment,ba=da.Semicolon;function ya(e){return this.Raw(e,ma.semicolonIncluded,!0)}var ka={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ga:case fa:case ba:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ya));}return {type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";");}));}},va=M.consumeNumber,xa=Ce.TYPE.Dimension,wa={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=va(this.scanner.source,e);return this.eat(xa),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit);}},Sa=Ce.TYPE.RightParenthesis,Ca={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,i=this.consumeFunctionName(),a=i.toLowerCase();return n=t.hasOwnProperty(a)?t[a].call(this,t):e.call(this,t),this.scanner.eof||this.eat(Sa),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:i,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")");},walkContext:"function"},za=Ce.TYPE.Hash,Aa={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(za),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value);}},Pa=Ce.TYPE.Ident,Ta={name:"Identifier",structure:{name:String},parse:function(){return {type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(Pa)}},generate:function(e){this.chunk(e.name);}},La=Ce.TYPE.Hash,Ea={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name);}},Da=Ce.TYPE,Oa=Da.Ident,Ba=Da.Number,Ia=Da.Dimension,Na=Da.LeftParenthesis,Ra=Da.RightParenthesis,Ma=Da.Colon,ja=Da.Delim,_a={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(Na),this.scanner.skipSC(),e=this.consume(Oa),this.scanner.skipSC(),this.scanner.tokenType!==Ra){switch(this.eat(Ma),this.scanner.skipSC(),this.scanner.tokenType){case Ba:n=this.lookupNonWSType(1)===ja?this.Ratio():this.Number();break;case Ia:n=this.Dimension();break;case Oa:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected");}this.scanner.skipSC();}return this.eat(Ra),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")");}},Fa=Ce.TYPE,Wa=Fa.WhiteSpace,qa=Fa.Comment,Ya=Fa.Ident,Ua=Fa.LeftParenthesis,Ha={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case qa:this.scanner.next();continue;case Wa:n=this.WhiteSpace();continue;case Ya:t=this.Identifier();break;case Ua:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t);}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e);}},Va=Ce.TYPE.Comma,Ka={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Va);)this.scanner.next();return {type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",");}));}},Ga=Ce.TYPE.Number,Qa={name:"Number",structure:{value:String},parse:function(){return {type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ga)}},generate:function(e){this.chunk(e.value);}},Xa={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value);}},Za=Ce.TYPE,$a=Za.LeftParenthesis,Ja=Za.RightParenthesis,eo={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat($a),n=e.call(this,t),this.scanner.eof||this.eat(Ja),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")");}},to=M.consumeNumber,no=Ce.TYPE.Percentage,ro={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=to(this.scanner.source,e);return this.eat(no),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%");}},io=Ce.TYPE,ao=io.Ident,oo=io.Function,so=io.Colon,lo=io.RightParenthesis,co={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(so),this.scanner.tokenType===oo?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(lo)):e=this.consume(ao),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"));},walkContext:"function"},uo=Ce.TYPE,ho=uo.Ident,po=uo.Function,mo=uo.Colon,go=uo.RightParenthesis,fo={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(mo),this.eat(mo),this.scanner.tokenType===po?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(go)):e=this.consume(ho),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"));},walkContext:"function"},bo=Ce.isDigit,yo=Ce.TYPE,ko=yo.Number,vo=yo.Delim;function xo(){this.scanner.skipWS();for(var e=this.consume(ko),t=0;t<e.length;t++){var n=e.charCodeAt(t);bo(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t);}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var wo={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=xo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(vo),e=xo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right);}},So=Ce.TYPE,Co=ni.mode,zo=So.LeftCurlyBracket;function Ao(e){return this.Raw(e,Co.leftCurlyBracket,!0)}function Po(){var e=this.SelectorList();return "Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==zo&&this.error(),e}var To={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(Po,Ao):Ao.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block);},walkContext:"rule"},Lo=Ce.TYPE.Comma,Eo={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===Lo);)this.scanner.next();return {type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",");}));},walkContext:"selector"},Do=Ce.TYPE.String,Oo={name:"String",structure:{value:String},parse:function(){return {type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Do)}},generate:function(e){this.chunk(e.value);}},Bo=Ce.TYPE,Io=Bo.WhiteSpace,No=Bo.Comment,Ro=Bo.AtKeyword,Mo=Bo.CDO,jo=Bo.CDC;function _o(e){return this.Raw(e,null,!1)}var Fo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case Io:this.scanner.next();continue;case No:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case Mo:e=this.CDO();break;case jo:e=this.CDC();break;case Ro:e=this.parseWithFallback(this.Atrule,_o);break;default:e=this.parseWithFallback(this.Rule,_o);}n.push(e);}return {type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e);},walkContext:"stylesheet"},Wo=Ce.TYPE.Ident;function qo(){this.scanner.tokenType!==Wo&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next();}var Yo={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),qo.call(this)):(qo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),qo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name);}},Uo=Ce.isHexDigit,Ho=Ce.cmpChar,Vo=Ce.TYPE,Ko=Ce.NAME,Go=Vo.Ident,Qo=Vo.Number,Xo=Vo.Dimension;function Zo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var i=this.scanner.source.charCodeAt(n);if(45===i&&t&&0!==r)return 0===Zo.call(this,e+r+1,!1)&&this.error(),-1;Uo(i)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n);}return this.scanner.next(),r}function $o(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next();}function Jo(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Ko[e]+" is expected");}function es(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Go?void((e=Zo.call(this,0,!0))>0&&$o.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void $o.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===Qo?(Jo.call(this,43),e=Zo.call(this,1,!0),this.scanner.isDelim(63)?void $o.call(this,6-e):this.scanner.tokenType===Xo||this.scanner.tokenType===Qo?(Jo.call(this,45),void Zo.call(this,1,!1)):void 0):this.scanner.tokenType===Xo?(Jo.call(this,43),void((e=Zo.call(this,1,!0))>0&&$o.call(this,6-e))):void this.error()}var ts={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Ho(this.scanner.source,e,117)||this.error("U is expected"),Ho(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),es.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value);}},ns=Ce.isWhiteSpace,rs=Ce.cmpStr,is=Ce.TYPE,as=is.Function,os=is.Url,ss=is.RightParenthesis,ls={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case os:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&ns(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&ns(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(os);break;case as:rs(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(as),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(ss);break;default:this.error("Url or Function is expected");}return {type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")");}},cs=Ce.TYPE.WhiteSpace,us=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),hs={AnPlusB:Gr,Atrule:hi,AtrulePrelude:gi,AttributeSelector:Ci,Block:Mi,Brackets:Wi,CDC:Yi,CDO:Hi,ClassSelector:Ki,Combinator:Qi,Comment:Zi,Declaration:ua,DeclarationList:ka,Dimension:wa,Function:Ca,Hash:Aa,Identifier:Ta,IdSelector:Ea,MediaFeature:_a,MediaQuery:Ha,MediaQueryList:Ka,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,i=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),i=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(i.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:i}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector));}},Number:Qa,Operator:Xa,Parentheses:eo,Percentage:ro,PseudoClassSelector:co,PseudoElementSelector:fo,Ratio:wo,Raw:ni,Rule:To,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e);}},SelectorList:Eo,String:Oo,StyleSheet:Fo,TypeSelector:Yo,UnicodeRange:ts,Url:ls,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return {type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e);}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat(cs),us},generate:function(e){this.chunk(e.value);}}},ps={generic:!0,types:Nr.types,atrules:Nr.atrules,properties:Nr.properties,node:hs},ds=Ce.cmpChar,ms=Ce.cmpStr,gs=Ce.TYPE,fs=gs.Ident,bs=gs.String,ys=gs.Number,ks=gs.Function,vs=gs.Url,xs=gs.Hash,ws=gs.Dimension,Ss=gs.Percentage,Cs=gs.LeftParenthesis,zs=gs.LeftSquareBracket,As=gs.Comma,Ps=gs.Delim,Ts=function(e){switch(this.scanner.tokenType){case xs:return this.Hash();case As:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case Cs:return this.Parentheses(this.readSequence,e.recognizer);case zs:return this.Brackets(this.readSequence,e.recognizer);case bs:return this.String();case ws:return this.Dimension();case Ss:return this.Percentage();case ys:return this.Number();case ks:return ms(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case vs:return this.Url();case fs:return ds(this.scanner.source,this.scanner.tokenStart,117)&&ds(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case Ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1);}},Ls={getNode:Ts},Es=Ce.TYPE,Ds=Es.Delim,Os=Es.Ident,Bs=Es.Dimension,Is=Es.Percentage,Ns=Es.Number,Rs=Es.Hash,Ms=Es.Colon,js=Es.LeftSquareBracket;var _s={getNode:function(e){switch(this.scanner.tokenType){case js:return this.AttributeSelector();case Rs:return this.IdSelector();case Ms:return this.scanner.lookupType(1)===Ms?this.PseudoElementSelector():this.PseudoClassSelector();case Os:return this.TypeSelector();case Ns:case Is:return this.Percentage();case Bs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case Ds:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},Fs=Ce.TYPE,Ws=ni.mode,qs=Fs.Comma,Ys=Fs.WhiteSpace,Us={AtrulePrelude:Ls,Selector:_s,Value:{getNode:Ts,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===qs){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ws.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ys){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n);}return e}}},Hs=Ce.TYPE,Vs=Hs.String,Ks=Hs.Ident,Gs=Hs.Url,Qs=Hs.Function,Xs=Hs.LeftParenthesis,Zs={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Vs:e.push(this.String());break;case Gs:case Qs:e.push(this.Url());break;default:this.error("String or url() is expected");}return this.lookupNonWSType(0)!==Ks&&this.lookupNonWSType(0)!==Xs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},$s=Ce.TYPE,Js=$s.WhiteSpace,el=$s.Comment,tl=$s.Ident,nl=$s.Function,rl=$s.Colon,il=$s.LeftParenthesis;function al(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function ol(){return this.scanner.skipSC(),this.scanner.tokenType===tl&&this.lookupNonWSType(1)===rl?this.createSingleNodeList(this.Declaration()):sl.call(this)}function sl(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Js:n=this.WhiteSpace();continue;case el:this.scanner.next();continue;case nl:e=this.Function(al,this.scope.AtrulePrelude);break;case tl:e=this.Identifier();break;case il:e=this.Parentheses(ol,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e);}return t}var ll,cl={parse:function(){return this.createSingleNodeList(this.SelectorList())}},ul={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},hl={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},pl={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Us,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Zs,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=sl.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:cl,not:cl,"nth-child":ul,"nth-last-child":ul,"nth-last-of-type":hl,"nth-of-type":hl,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:hs},dl={node:hs},ml={version:"1.1.2"},gl=(ll=Object.freeze({__proto__:null,version:"1.1.2",default:ml}))&&ll.default||ll;var fl=Ir(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r];}return e}(ps,pl,dl)),bl=gl.version;return fl.version=bl,fl}));
+ });
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ function buildMap(list, caseInsensitive) {
+ var map = Object.create(null);
+
+ if (!Array.isArray(list)) {
+ return null;
+ }
+
+ for (var i = 0; i < list.length; i++) {
+ var name = list[i];
+
+ if (caseInsensitive) {
+ name = name.toLowerCase();
+ }
+
+ map[name] = true;
+ }
+
+ return map;
+ }
+
+ function buildList(data) {
+ if (!data) {
+ return null;
+ }
+
+ var tags = buildMap(data.tags, true);
+ var ids = buildMap(data.ids);
+ var classes = buildMap(data.classes);
+
+ if (tags === null &&
+ ids === null &&
+ classes === null) {
+ return null;
+ }
+
+ return {
+ tags: tags,
+ ids: ids,
+ classes: classes
+ };
+ }
+
+ function buildIndex(data) {
+ var scopes = false;
+
+ if (data.scopes && Array.isArray(data.scopes)) {
+ scopes = Object.create(null);
+
+ for (var i = 0; i < data.scopes.length; i++) {
+ var list = data.scopes[i];
+
+ if (!list || !Array.isArray(list)) {
+ throw new Error('Wrong usage format');
+ }
+
+ for (var j = 0; j < list.length; j++) {
+ var name = list[j];
+
+ if (hasOwnProperty.call(scopes, name)) {
+ throw new Error('Class can\'t be used for several scopes: ' + name);
+ }
+
+ scopes[name] = i + 1;
+ }
+ }
+ }
+
+ return {
+ whitelist: buildList(data),
+ blacklist: buildList(data.blacklist),
+ scopes: scopes
+ };
+ }
+
+ var usage = {
+ buildIndex: buildIndex
+ };
+
+ var utils = {
+ hasNoChildren: function(node) {
+ return !node || !node.children || node.children.isEmpty();
+ },
+ isNodeChildrenList: function(node, list) {
+ return node !== null && node.children === list;
+ }
+ };
+
+ var resolveKeyword = csstree_min.keyword;
+ var { hasNoChildren } = utils;
+
+ var Atrule = function cleanAtrule(node, item, list) {
+ if (node.block) {
+ // otherwise removed at-rule don't prevent @import for removal
+ if (this.stylesheet !== null) {
+ this.stylesheet.firstAtrulesAllowed = false;
+ }
+
+ if (hasNoChildren(node.block)) {
+ list.remove(item);
+ return;
+ }
+ }
+
+ switch (node.name) {
+ case 'charset':
+ if (hasNoChildren(node.prelude)) {
+ list.remove(item);
+ return;
+ }
+
+ // if there is any rule before @charset -> remove it
+ if (item.prev) {
+ list.remove(item);
+ return;
+ }
+
+ break;
+
+ case 'import':
+ if (this.stylesheet === null || !this.stylesheet.firstAtrulesAllowed) {
+ list.remove(item);
+ return;
+ }
+
+ // if there are some rules that not an @import or @charset before @import
+ // remove it
+ list.prevUntil(item.prev, function(rule) {
+ if (rule.type === 'Atrule') {
+ if (rule.name === 'import' || rule.name === 'charset') {
+ return;
+ }
+ }
+
+ this.root.firstAtrulesAllowed = false;
+ list.remove(item);
+ return true;
+ }, this);
+
+ break;
+
+ default:
+ var name = resolveKeyword(node.name).basename;
+ if (name === 'keyframes' ||
+ name === 'media' ||
+ name === 'supports') {
+
+ // drop at-rule with no prelude
+ if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+ list.remove(item);
+ }
+ }
+ }
+ };
+
+ var Comment = function cleanComment(data, item, list) {
+ list.remove(item);
+ };
+
+ var property = csstree_min.property;
+
+ var Declaration = function cleanDeclartion(node, item, list) {
+ if (node.value.children && node.value.children.isEmpty()) {
+ list.remove(item);
+ return;
+ }
+
+ if (property(node.property).custom) {
+ if (/\S/.test(node.value.value)) {
+ node.value.value = node.value.value.trim();
+ }
+ }
+ };
+
+ var { isNodeChildrenList } = utils;
+
+ var Raw = function cleanRaw(node, item, list) {
+ // raw in stylesheet or block children
+ if (isNodeChildrenList(this.stylesheet, list) ||
+ isNodeChildrenList(this.block, list)) {
+ list.remove(item);
+ }
+ };
+
+ var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+ var walk = csstree_min.walk;
+ var { hasNoChildren: hasNoChildren$1 } = utils;
+
+ function cleanUnused(selectorList, usageData) {
+ selectorList.children.each(function(selector, item, list) {
+ var shouldRemove = false;
+
+ walk(selector, function(node) {
+ // ignore nodes in nested selectors
+ if (this.selector === null || this.selector === selectorList) {
+ switch (node.type) {
+ case 'SelectorList':
+ // TODO: remove toLowerCase when pseudo selectors will be normalized
+ // ignore selectors inside :not()
+ if (this.function === null || this.function.name.toLowerCase() !== 'not') {
+ if (cleanUnused(node, usageData)) {
+ shouldRemove = true;
+ }
+ }
+ break;
+
+ case 'ClassSelector':
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.classes !== null &&
+ !hasOwnProperty$1.call(usageData.whitelist.classes, node.name)) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.classes !== null &&
+ hasOwnProperty$1.call(usageData.blacklist.classes, node.name)) {
+ shouldRemove = true;
+ }
+ break;
+
+ case 'IdSelector':
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.ids !== null &&
+ !hasOwnProperty$1.call(usageData.whitelist.ids, node.name)) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.ids !== null &&
+ hasOwnProperty$1.call(usageData.blacklist.ids, node.name)) {
+ shouldRemove = true;
+ }
+ break;
+
+ case 'TypeSelector':
+ // TODO: remove toLowerCase when type selectors will be normalized
+ // ignore universal selectors
+ if (node.name.charAt(node.name.length - 1) !== '*') {
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.tags !== null &&
+ !hasOwnProperty$1.call(usageData.whitelist.tags, node.name.toLowerCase())) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.tags !== null &&
+ hasOwnProperty$1.call(usageData.blacklist.tags, node.name.toLowerCase())) {
+ shouldRemove = true;
+ }
+ }
+ break;
+ }
+ }
+ });
+
+ if (shouldRemove) {
+ list.remove(item);
+ }
+ });
+
+ return selectorList.children.isEmpty();
+ }
+
+ var Rule = function cleanRule(node, item, list, options) {
+ if (hasNoChildren$1(node.prelude) || hasNoChildren$1(node.block)) {
+ list.remove(item);
+ return;
+ }
+
+ var usageData = options.usage;
+
+ if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {
+ cleanUnused(node.prelude, usageData);
+
+ if (hasNoChildren$1(node.prelude)) {
+ list.remove(item);
+ return;
+ }
+ }
+ };
+
+ // remove useless universal selector
+ var TypeSelector = function cleanTypeSelector(node, item, list) {
+ var name = item.data.name;
+
+ // check it's a non-namespaced universal selector
+ if (name !== '*') {
+ return;
+ }
+
+ // remove when universal selector before other selectors
+ var nextType = item.next && item.next.data.type;
+ if (nextType === 'IdSelector' ||
+ nextType === 'ClassSelector' ||
+ nextType === 'AttributeSelector' ||
+ nextType === 'PseudoClassSelector' ||
+ nextType === 'PseudoElementSelector') {
+ list.remove(item);
+ }
+ };
+
+ var { isNodeChildrenList: isNodeChildrenList$1 } = utils;
+
+ function isSafeOperator(node) {
+ return node.type === 'Operator' && node.value !== '+' && node.value !== '-';
+ }
+
+ var WhiteSpace = function cleanWhitespace(node, item, list) {
+ // remove when first or last item in sequence
+ if (item.next === null || item.prev === null) {
+ list.remove(item);
+ return;
+ }
+
+ // white space in stylesheet or block children
+ if (isNodeChildrenList$1(this.stylesheet, list) ||
+ isNodeChildrenList$1(this.block, list)) {
+ list.remove(item);
+ return;
+ }
+
+ if (item.next.data.type === 'WhiteSpace') {
+ list.remove(item);
+ return;
+ }
+
+ if (isSafeOperator(item.prev.data) || isSafeOperator(item.next.data)) {
+ list.remove(item);
+ return;
+ }
+ };
+
+ var walk$1 = csstree_min.walk;
+ var handlers = {
+ Atrule: Atrule,
+ Comment: Comment,
+ Declaration: Declaration,
+ Raw: Raw,
+ Rule: Rule,
+ TypeSelector: TypeSelector,
+ WhiteSpace: WhiteSpace
+ };
+
+ var clean = function(ast, options) {
+ walk$1(ast, {
+ leave: function(node, item, list) {
+ if (handlers.hasOwnProperty(node.type)) {
+ handlers[node.type].call(this, node, item, list, options);
+ }
+ }
+ });
+ };
+
+ var keyframes = function(node) {
+ node.block.children.each(function(rule) {
+ rule.prelude.children.each(function(simpleselector) {
+ simpleselector.children.each(function(data, item) {
+ if (data.type === 'Percentage' && data.value === '100') {
+ item.data = {
+ type: 'TypeSelector',
+ loc: data.loc,
+ name: 'to'
+ };
+ } else if (data.type === 'TypeSelector' && data.name === 'from') {
+ item.data = {
+ type: 'Percentage',
+ loc: data.loc,
+ value: '0'
+ };
+ }
+ });
+ });
+ });
+ };
+
+ var resolveKeyword$1 = csstree_min.keyword;
+
+
+ var Atrule$1 = function(node) {
+ // compress @keyframe selectors
+ if (resolveKeyword$1(node.name).basename === 'keyframes') {
+ keyframes(node);
+ }
+ };
+
+ // Can unquote attribute detection
+ // Adopted implementation of Mathias Bynens
+ // https://github.com/mathiasbynens/mothereff.in/blob/master/unquoted-attributes/eff.js
+ var escapesRx = /\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g;
+ var blockUnquoteRx = /^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;
+
+ function canUnquote(value) {
+ if (value === '' || value === '-') {
+ return;
+ }
+
+ // Escapes are valid, so replace them with a valid non-empty string
+ value = value.replace(escapesRx, 'a');
+
+ return !blockUnquoteRx.test(value);
+ }
+
+ var AttributeSelector = function(node) {
+ var attrValue = node.value;
+
+ if (!attrValue || attrValue.type !== 'String') {
+ return;
+ }
+
+ var unquotedValue = attrValue.value.replace(/^(.)(.*)\1$/, '$2');
+ if (canUnquote(unquotedValue)) {
+ node.value = {
+ type: 'Identifier',
+ loc: attrValue.loc,
+ name: unquotedValue
+ };
+ }
+ };
+
+ var font = function compressFont(node) {
+ var list = node.children;
+
+ list.eachRight(function(node, item) {
+ if (node.type === 'Identifier') {
+ if (node.name === 'bold') {
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: '700'
+ };
+ } else if (node.name === 'normal') {
+ var prev = item.prev;
+
+ if (prev && prev.data.type === 'Operator' && prev.data.value === '/') {
+ this.remove(prev);
+ }
+
+ this.remove(item);
+ } else if (node.name === 'medium') {
+ var next = item.next;
+
+ if (!next || next.data.type !== 'Operator') {
+ this.remove(item);
+ }
+ }
+ }
+ });
+
+ // remove redundant spaces
+ list.each(function(node, item) {
+ if (node.type === 'WhiteSpace') {
+ if (!item.prev || !item.next || item.next.data.type === 'WhiteSpace') {
+ this.remove(item);
+ }
+ }
+ });
+
+ if (list.isEmpty()) {
+ list.insert(list.createItem({
+ type: 'Identifier',
+ name: 'normal'
+ }));
+ }
+ };
+
+ var fontWeight = function compressFontWeight(node) {
+ var value = node.children.head.data;
+
+ if (value.type === 'Identifier') {
+ switch (value.name) {
+ case 'normal':
+ node.children.head.data = {
+ type: 'Number',
+ loc: value.loc,
+ value: '400'
+ };
+ break;
+ case 'bold':
+ node.children.head.data = {
+ type: 'Number',
+ loc: value.loc,
+ value: '700'
+ };
+ break;
+ }
+ }
+ };
+
+ var List = csstree_min.List;
+
+ var background = function compressBackground(node) {
+ function lastType() {
+ if (buffer.length) {
+ return buffer[buffer.length - 1].type;
+ }
+ }
+
+ function flush() {
+ if (lastType() === 'WhiteSpace') {
+ buffer.pop();
+ }
+
+ if (!buffer.length) {
+ buffer.unshift(
+ {
+ type: 'Number',
+ loc: null,
+ value: '0'
+ },
+ {
+ type: 'WhiteSpace',
+ value: ' '
+ },
+ {
+ type: 'Number',
+ loc: null,
+ value: '0'
+ }
+ );
+ }
+
+ newValue.push.apply(newValue, buffer);
+
+ buffer = [];
+ }
+
+ var newValue = [];
+ var buffer = [];
+
+ node.children.each(function(node) {
+ if (node.type === 'Operator' && node.value === ',') {
+ flush();
+ newValue.push(node);
+ return;
+ }
+
+ // remove defaults
+ if (node.type === 'Identifier') {
+ if (node.name === 'transparent' ||
+ node.name === 'none' ||
+ node.name === 'repeat' ||
+ node.name === 'scroll') {
+ return;
+ }
+ }
+
+ // don't add redundant spaces
+ if (node.type === 'WhiteSpace' && (!buffer.length || lastType() === 'WhiteSpace')) {
+ return;
+ }
+
+ buffer.push(node);
+ });
+
+ flush();
+ node.children = new List().fromArray(newValue);
+ };
+
+ function removeItemAndRedundantWhiteSpace(list, item) {
+ var prev = item.prev;
+ var next = item.next;
+
+ if (next !== null) {
+ if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) {
+ list.remove(next);
+ }
+ } else if (prev !== null && prev.data.type === 'WhiteSpace') {
+ list.remove(prev);
+ }
+
+ list.remove(item);
+ }
+
+ var border = function compressBorder(node) {
+ node.children.each(function(node, item, list) {
+ if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') {
+ if (list.head === list.tail) {
+ // replace `none` for zero when `none` is a single term
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: '0'
+ };
+ } else {
+ removeItemAndRedundantWhiteSpace(list, item);
+ }
+ }
+ });
+ };
+
+ var resolveName = csstree_min.property;
+ var handlers$1 = {
+ 'font': font,
+ 'font-weight': fontWeight,
+ 'background': background,
+ 'border': border,
+ 'outline': border
+ };
+
+ var Value = function compressValue(node) {
+ if (!this.declaration) {
+ return;
+ }
+
+ var property = resolveName(this.declaration.property);
+
+ if (handlers$1.hasOwnProperty(property.basename)) {
+ handlers$1[property.basename](node);
+ }
+ };
+
+ var OMIT_PLUSSIGN = /^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+ var KEEP_PLUSSIGN = /^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+ var unsafeToRemovePlusSignAfter = {
+ Dimension: true,
+ Hash: true,
+ Identifier: true,
+ Number: true,
+ Raw: true,
+ UnicodeRange: true
+ };
+
+ function packNumber(value, item) {
+ // omit plus sign only if no prev or prev is safe type
+ var regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)
+ ? KEEP_PLUSSIGN
+ : OMIT_PLUSSIGN;
+
+ // 100 -> '100'
+ // 00100 -> '100'
+ // +100 -> '100' (only when safe, e.g. omitting plus sign for 1px+1px leads to single dimension instead of two)
+ // -100 -> '-100'
+ // 0.123 -> '.123'
+ // 0.12300 -> '.123'
+ // 0.0 -> ''
+ // 0 -> ''
+ // -0 -> '-'
+ value = String(value).replace(regexp, '$1$2$3');
+
+ if (value === '' || value === '-') {
+ value = '0';
+ }
+
+ return value;
+ }
+
+ var _Number = function(node, item) {
+ node.value = packNumber(node.value, item);
+ };
+ var pack = packNumber;
+ _Number.pack = pack;
+
+ var packNumber$1 = _Number.pack;
+ var MATH_FUNCTIONS = {
+ 'calc': true,
+ 'min': true,
+ 'max': true,
+ 'clamp': true
+ };
+ var LENGTH_UNIT = {
+ // absolute length units
+ 'px': true,
+ 'mm': true,
+ 'cm': true,
+ 'in': true,
+ 'pt': true,
+ 'pc': true,
+
+ // relative length units
+ 'em': true,
+ 'ex': true,
+ 'ch': true,
+ 'rem': true,
+
+ // viewport-percentage lengths
+ 'vh': true,
+ 'vw': true,
+ 'vmin': true,
+ 'vmax': true,
+ 'vm': true
+ };
+
+ var Dimension = function compressDimension(node, item) {
+ var value = packNumber$1(node.value, item);
+
+ node.value = value;
+
+ if (value === '0' && this.declaration !== null && this.atrulePrelude === null) {
+ var unit = node.unit.toLowerCase();
+
+ // only length values can be compressed
+ if (!LENGTH_UNIT.hasOwnProperty(unit)) {
+ return;
+ }
+
+ // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+ // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+ if (this.declaration.property === '-ms-flex' ||
+ this.declaration.property === 'flex') {
+ return;
+ }
+
+ // issue #222: don't remove units inside calc
+ if (this.function && MATH_FUNCTIONS.hasOwnProperty(this.function.name)) {
+ return;
+ }
+
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: value
+ };
+ }
+ };
+
+ var lexer = csstree_min.lexer;
+ var packNumber$2 = _Number.pack;
+ var blacklist = new Set([
+ // see https://github.com/jakubpawlowicz/clean-css/issues/957
+ 'width',
+ 'min-width',
+ 'max-width',
+ 'height',
+ 'min-height',
+ 'max-height',
+
+ // issue #410: Don’t remove units in flex-basis value for (-ms-)flex shorthand
+ // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+ // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+ 'flex',
+ '-ms-flex'
+ ]);
+
+ var Percentage = function compressPercentage(node, item) {
+ node.value = packNumber$2(node.value, item);
+
+ if (node.value === '0' && this.declaration && !blacklist.has(this.declaration.property)) {
+ // try to convert a number
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: node.value
+ };
+
+ // that's ok only when new value matches on length
+ if (!lexer.matchDeclaration(this.declaration).isType(item.data, 'length')) {
+ // otherwise rollback changes
+ item.data = node;
+ }
+ }
+ };
+
+ var _String = function(node) {
+ var value = node.value;
+
+ // remove escaped newlines, i.e.
+ // .a { content: "foo\
+ // bar"}
+ // ->
+ // .a { content: "foobar" }
+ value = value.replace(/\\(\r\n|\r|\n|\f)/g, '');
+
+ node.value = value;
+ };
+
+ var UNICODE = '\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?';
+ var ESCAPE = '(' + UNICODE + '|\\\\[^\\n\\r\\f0-9a-fA-F])';
+ var NONPRINTABLE = '\u0000\u0008\u000b\u000e-\u001f\u007f';
+ var SAFE_URL = new RegExp('^(' + ESCAPE + '|[^\"\'\\(\\)\\\\\\s' + NONPRINTABLE + '])*$', 'i');
+
+ var Url = function(node) {
+ var value = node.value;
+
+ if (value.type !== 'String') {
+ return;
+ }
+
+ var quote = value.value[0];
+ var url = value.value.substr(1, value.value.length - 2);
+
+ // convert `\\` to `/`
+ url = url.replace(/\\\\/g, '/');
+
+ // remove quotes when safe
+ // https://www.w3.org/TR/css-syntax-3/#url-unquoted-diagram
+ if (SAFE_URL.test(url)) {
+ node.value = {
+ type: 'Raw',
+ loc: node.value.loc,
+ value: url
+ };
+ } else {
+ // use double quotes if string has no double quotes
+ // otherwise use original quotes
+ // TODO: make better quote type selection
+ node.value.value = url.indexOf('"') === -1 ? '"' + url + '"' : quote + url + quote;
+ }
+ };
+
+ var lexer$1 = csstree_min.lexer;
+ var packNumber$3 = _Number.pack;
+
+ // http://www.w3.org/TR/css3-color/#svg-color
+ var NAME_TO_HEX = {
+ 'aliceblue': 'f0f8ff',
+ 'antiquewhite': 'faebd7',
+ 'aqua': '0ff',
+ 'aquamarine': '7fffd4',
+ 'azure': 'f0ffff',
+ 'beige': 'f5f5dc',
+ 'bisque': 'ffe4c4',
+ 'black': '000',
+ 'blanchedalmond': 'ffebcd',
+ 'blue': '00f',
+ 'blueviolet': '8a2be2',
+ 'brown': 'a52a2a',
+ 'burlywood': 'deb887',
+ 'cadetblue': '5f9ea0',
+ 'chartreuse': '7fff00',
+ 'chocolate': 'd2691e',
+ 'coral': 'ff7f50',
+ 'cornflowerblue': '6495ed',
+ 'cornsilk': 'fff8dc',
+ 'crimson': 'dc143c',
+ 'cyan': '0ff',
+ 'darkblue': '00008b',
+ 'darkcyan': '008b8b',
+ 'darkgoldenrod': 'b8860b',
+ 'darkgray': 'a9a9a9',
+ 'darkgrey': 'a9a9a9',
+ 'darkgreen': '006400',
+ 'darkkhaki': 'bdb76b',
+ 'darkmagenta': '8b008b',
+ 'darkolivegreen': '556b2f',
+ 'darkorange': 'ff8c00',
+ 'darkorchid': '9932cc',
+ 'darkred': '8b0000',
+ 'darksalmon': 'e9967a',
+ 'darkseagreen': '8fbc8f',
+ 'darkslateblue': '483d8b',
+ 'darkslategray': '2f4f4f',
+ 'darkslategrey': '2f4f4f',
+ 'darkturquoise': '00ced1',
+ 'darkviolet': '9400d3',
+ 'deeppink': 'ff1493',
+ 'deepskyblue': '00bfff',
+ 'dimgray': '696969',
+ 'dimgrey': '696969',
+ 'dodgerblue': '1e90ff',
+ 'firebrick': 'b22222',
+ 'floralwhite': 'fffaf0',
+ 'forestgreen': '228b22',
+ 'fuchsia': 'f0f',
+ 'gainsboro': 'dcdcdc',
+ 'ghostwhite': 'f8f8ff',
+ 'gold': 'ffd700',
+ 'goldenrod': 'daa520',
+ 'gray': '808080',
+ 'grey': '808080',
+ 'green': '008000',
+ 'greenyellow': 'adff2f',
+ 'honeydew': 'f0fff0',
+ 'hotpink': 'ff69b4',
+ 'indianred': 'cd5c5c',
+ 'indigo': '4b0082',
+ 'ivory': 'fffff0',
+ 'khaki': 'f0e68c',
+ 'lavender': 'e6e6fa',
+ 'lavenderblush': 'fff0f5',
+ 'lawngreen': '7cfc00',
+ 'lemonchiffon': 'fffacd',
+ 'lightblue': 'add8e6',
+ 'lightcoral': 'f08080',
+ 'lightcyan': 'e0ffff',
+ 'lightgoldenrodyellow': 'fafad2',
+ 'lightgray': 'd3d3d3',
+ 'lightgrey': 'd3d3d3',
+ 'lightgreen': '90ee90',
+ 'lightpink': 'ffb6c1',
+ 'lightsalmon': 'ffa07a',
+ 'lightseagreen': '20b2aa',
+ 'lightskyblue': '87cefa',
+ 'lightslategray': '789',
+ 'lightslategrey': '789',
+ 'lightsteelblue': 'b0c4de',
+ 'lightyellow': 'ffffe0',
+ 'lime': '0f0',
+ 'limegreen': '32cd32',
+ 'linen': 'faf0e6',
+ 'magenta': 'f0f',
+ 'maroon': '800000',
+ 'mediumaquamarine': '66cdaa',
+ 'mediumblue': '0000cd',
+ 'mediumorchid': 'ba55d3',
+ 'mediumpurple': '9370db',
+ 'mediumseagreen': '3cb371',
+ 'mediumslateblue': '7b68ee',
+ 'mediumspringgreen': '00fa9a',
+ 'mediumturquoise': '48d1cc',
+ 'mediumvioletred': 'c71585',
+ 'midnightblue': '191970',
+ 'mintcream': 'f5fffa',
+ 'mistyrose': 'ffe4e1',
+ 'moccasin': 'ffe4b5',
+ 'navajowhite': 'ffdead',
+ 'navy': '000080',
+ 'oldlace': 'fdf5e6',
+ 'olive': '808000',
+ 'olivedrab': '6b8e23',
+ 'orange': 'ffa500',
+ 'orangered': 'ff4500',
+ 'orchid': 'da70d6',
+ 'palegoldenrod': 'eee8aa',
+ 'palegreen': '98fb98',
+ 'paleturquoise': 'afeeee',
+ 'palevioletred': 'db7093',
+ 'papayawhip': 'ffefd5',
+ 'peachpuff': 'ffdab9',
+ 'peru': 'cd853f',
+ 'pink': 'ffc0cb',
+ 'plum': 'dda0dd',
+ 'powderblue': 'b0e0e6',
+ 'purple': '800080',
+ 'rebeccapurple': '639',
+ 'red': 'f00',
+ 'rosybrown': 'bc8f8f',
+ 'royalblue': '4169e1',
+ 'saddlebrown': '8b4513',
+ 'salmon': 'fa8072',
+ 'sandybrown': 'f4a460',
+ 'seagreen': '2e8b57',
+ 'seashell': 'fff5ee',
+ 'sienna': 'a0522d',
+ 'silver': 'c0c0c0',
+ 'skyblue': '87ceeb',
+ 'slateblue': '6a5acd',
+ 'slategray': '708090',
+ 'slategrey': '708090',
+ 'snow': 'fffafa',
+ 'springgreen': '00ff7f',
+ 'steelblue': '4682b4',
+ 'tan': 'd2b48c',
+ 'teal': '008080',
+ 'thistle': 'd8bfd8',
+ 'tomato': 'ff6347',
+ 'turquoise': '40e0d0',
+ 'violet': 'ee82ee',
+ 'wheat': 'f5deb3',
+ 'white': 'fff',
+ 'whitesmoke': 'f5f5f5',
+ 'yellow': 'ff0',
+ 'yellowgreen': '9acd32'
+ };
+
+ var HEX_TO_NAME = {
+ '800000': 'maroon',
+ '800080': 'purple',
+ '808000': 'olive',
+ '808080': 'gray',
+ '00ffff': 'cyan',
+ 'f0ffff': 'azure',
+ 'f5f5dc': 'beige',
+ 'ffe4c4': 'bisque',
+ '000000': 'black',
+ '0000ff': 'blue',
+ 'a52a2a': 'brown',
+ 'ff7f50': 'coral',
+ 'ffd700': 'gold',
+ '008000': 'green',
+ '4b0082': 'indigo',
+ 'fffff0': 'ivory',
+ 'f0e68c': 'khaki',
+ '00ff00': 'lime',
+ 'faf0e6': 'linen',
+ '000080': 'navy',
+ 'ffa500': 'orange',
+ 'da70d6': 'orchid',
+ 'cd853f': 'peru',
+ 'ffc0cb': 'pink',
+ 'dda0dd': 'plum',
+ 'f00': 'red',
+ 'ff0000': 'red',
+ 'fa8072': 'salmon',
+ 'a0522d': 'sienna',
+ 'c0c0c0': 'silver',
+ 'fffafa': 'snow',
+ 'd2b48c': 'tan',
+ '008080': 'teal',
+ 'ff6347': 'tomato',
+ 'ee82ee': 'violet',
+ 'f5deb3': 'wheat',
+ 'ffffff': 'white',
+ 'ffff00': 'yellow'
+ };
+
+ function hueToRgb(p, q, t) {
+ if (t < 0) {
+ t += 1;
+ }
+ if (t > 1) {
+ t -= 1;
+ }
+ if (t < 1 / 6) {
+ return p + (q - p) * 6 * t;
+ }
+ if (t < 1 / 2) {
+ return q;
+ }
+ if (t < 2 / 3) {
+ return p + (q - p) * (2 / 3 - t) * 6;
+ }
+ return p;
+ }
+
+ function hslToRgb(h, s, l, a) {
+ var r;
+ var g;
+ var b;
+
+ if (s === 0) {
+ r = g = b = l; // achromatic
+ } else {
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ var p = 2 * l - q;
+
+ r = hueToRgb(p, q, h + 1 / 3);
+ g = hueToRgb(p, q, h);
+ b = hueToRgb(p, q, h - 1 / 3);
+ }
+
+ return [
+ Math.round(r * 255),
+ Math.round(g * 255),
+ Math.round(b * 255),
+ a
+ ];
+ }
+
+ function toHex(value) {
+ value = value.toString(16);
+ return value.length === 1 ? '0' + value : value;
+ }
+
+ function parseFunctionArgs(functionArgs, count, rgb) {
+ var cursor = functionArgs.head;
+ var args = [];
+ var wasValue = false;
+
+ while (cursor !== null) {
+ var node = cursor.data;
+ var type = node.type;
+
+ switch (type) {
+ case 'Number':
+ case 'Percentage':
+ if (wasValue) {
+ return;
+ }
+
+ wasValue = true;
+ args.push({
+ type: type,
+ value: Number(node.value)
+ });
+ break;
+
+ case 'Operator':
+ if (node.value === ',') {
+ if (!wasValue) {
+ return;
+ }
+ wasValue = false;
+ } else if (wasValue || node.value !== '+') {
+ return;
+ }
+ break;
+
+ default:
+ // something we couldn't understand
+ return;
+ }
+
+ cursor = cursor.next;
+ }
+
+ if (args.length !== count) {
+ // invalid arguments count
+ // TODO: remove those tokens
+ return;
+ }
+
+ if (args.length === 4) {
+ if (args[3].type !== 'Number') {
+ // 4th argument should be a number
+ // TODO: remove those tokens
+ return;
+ }
+
+ args[3].type = 'Alpha';
+ }
+
+ if (rgb) {
+ if (args[0].type !== args[1].type || args[0].type !== args[2].type) {
+ // invalid color, numbers and percentage shouldn't be mixed
+ // TODO: remove those tokens
+ return;
+ }
+ } else {
+ if (args[0].type !== 'Number' ||
+ args[1].type !== 'Percentage' ||
+ args[2].type !== 'Percentage') {
+ // invalid color, for hsl values should be: number, percentage, percentage
+ // TODO: remove those tokens
+ return;
+ }
+
+ args[0].type = 'Angle';
+ }
+
+ return args.map(function(arg) {
+ var value = Math.max(0, arg.value);
+
+ switch (arg.type) {
+ case 'Number':
+ // fit value to [0..255] range
+ value = Math.min(value, 255);
+ break;
+
+ case 'Percentage':
+ // convert 0..100% to value in [0..255] range
+ value = Math.min(value, 100) / 100;
+
+ if (!rgb) {
+ return value;
+ }
+
+ value = 255 * value;
+ break;
+
+ case 'Angle':
+ // fit value to (-360..360) range
+ return (((value % 360) + 360) % 360) / 360;
+
+ case 'Alpha':
+ // fit value to [0..1] range
+ return Math.min(value, 1);
+ }
+
+ return Math.round(value);
+ });
+ }
+
+ function compressFunction(node, item, list) {
+ var functionName = node.name;
+ var args;
+
+ if (functionName === 'rgba' || functionName === 'hsla') {
+ args = parseFunctionArgs(node.children, 4, functionName === 'rgba');
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ if (functionName === 'hsla') {
+ args = hslToRgb.apply(null, args);
+ node.name = 'rgba';
+ }
+
+ if (args[3] === 0) {
+ // try to replace `rgba(x, x, x, 0)` to `transparent`
+ // always replace `rgba(0, 0, 0, 0)` to `transparent`
+ // otherwise avoid replacement in gradients since it may break color transition
+ // http://stackoverflow.com/questions/11829410/css3-gradient-rendering-issues-from-transparent-to-white
+ var scopeFunctionName = this.function && this.function.name;
+ if ((args[0] === 0 && args[1] === 0 && args[2] === 0) ||
+ !/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)) {
+
+ item.data = {
+ type: 'Identifier',
+ loc: node.loc,
+ name: 'transparent'
+ };
+
+ return;
+ }
+ }
+
+ if (args[3] !== 1) {
+ // replace argument values for normalized/interpolated
+ node.children.each(function(node, item, list) {
+ if (node.type === 'Operator') {
+ if (node.value !== ',') {
+ list.remove(item);
+ }
+ return;
+ }
+
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: packNumber$3(args.shift(), null)
+ };
+ });
+
+ return;
+ }
+
+ // otherwise convert to rgb, i.e. rgba(255, 0, 0, 1) -> rgb(255, 0, 0)
+ functionName = 'rgb';
+ }
+
+ if (functionName === 'hsl') {
+ args = args || parseFunctionArgs(node.children, 3, false);
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ // convert to rgb
+ args = hslToRgb.apply(null, args);
+ functionName = 'rgb';
+ }
+
+ if (functionName === 'rgb') {
+ args = args || parseFunctionArgs(node.children, 3, true);
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ // check if color is not at the end and not followed by space
+ var next = item.next;
+ if (next && next.data.type !== 'WhiteSpace') {
+ list.insert(list.createItem({
+ type: 'WhiteSpace',
+ value: ' '
+ }), next);
+ }
+
+ item.data = {
+ type: 'Hash',
+ loc: node.loc,
+ value: toHex(args[0]) + toHex(args[1]) + toHex(args[2])
+ };
+
+ compressHex(item.data, item);
+ }
+ }
+
+ function compressIdent(node, item) {
+ if (this.declaration === null) {
+ return;
+ }
+
+ var color = node.name.toLowerCase();
+
+ if (NAME_TO_HEX.hasOwnProperty(color) &&
+ lexer$1.matchDeclaration(this.declaration).isType(node, 'color')) {
+ var hex = NAME_TO_HEX[color];
+
+ if (hex.length + 1 <= color.length) {
+ // replace for shorter hex value
+ item.data = {
+ type: 'Hash',
+ loc: node.loc,
+ value: hex
+ };
+ } else {
+ // special case for consistent colors
+ if (color === 'grey') {
+ color = 'gray';
+ }
+
+ // just replace value for lower cased name
+ node.name = color;
+ }
+ }
+ }
+
+ function compressHex(node, item) {
+ var color = node.value.toLowerCase();
+
+ // #112233 -> #123
+ if (color.length === 6 &&
+ color[0] === color[1] &&
+ color[2] === color[3] &&
+ color[4] === color[5]) {
+ color = color[0] + color[2] + color[4];
+ }
+
+ if (HEX_TO_NAME[color]) {
+ item.data = {
+ type: 'Identifier',
+ loc: node.loc,
+ name: HEX_TO_NAME[color]
+ };
+ } else {
+ node.value = color;
+ }
+ }
+
+ var color = {
+ compressFunction: compressFunction,
+ compressIdent: compressIdent,
+ compressHex: compressHex
+ };
+
+ var walk$2 = csstree_min.walk;
+ var handlers$2 = {
+ Atrule: Atrule$1,
+ AttributeSelector: AttributeSelector,
+ Value: Value,
+ Dimension: Dimension,
+ Percentage: Percentage,
+ Number: _Number,
+ String: _String,
+ Url: Url,
+ Hash: color.compressHex,
+ Identifier: color.compressIdent,
+ Function: color.compressFunction
+ };
+
+ var replace = function(ast) {
+ walk$2(ast, {
+ leave: function(node, item, list) {
+ if (handlers$2.hasOwnProperty(node.type)) {
+ handlers$2[node.type].call(this, node, item, list);
+ }
+ }
+ });
+ };
+
+ var generate = csstree_min.generate;
+
+ function Index() {
+ this.seed = 0;
+ this.map = Object.create(null);
+ }
+
+ Index.prototype.resolve = function(str) {
+ var index = this.map[str];
+
+ if (!index) {
+ index = ++this.seed;
+ this.map[str] = index;
+ }
+
+ return index;
+ };
+
+ var createDeclarationIndexer = function createDeclarationIndexer() {
+ var ids = new Index();
+
+ return function markDeclaration(node) {
+ var id = generate(node);
+
+ node.id = ids.resolve(id);
+ node.length = id.length;
+ node.fingerprint = null;
+
+ return node;
+ };
+ };
+
+ var specificity = function specificity(simpleSelector) {
+ var A = 0;
+ var B = 0;
+ var C = 0;
+
+ simpleSelector.children.each(function walk(node) {
+ switch (node.type) {
+ case 'SelectorList':
+ case 'Selector':
+ node.children.each(walk);
+ break;
+
+ case 'IdSelector':
+ A++;
+ break;
+
+ case 'ClassSelector':
+ case 'AttributeSelector':
+ B++;
+ break;
+
+ case 'PseudoClassSelector':
+ switch (node.name.toLowerCase()) {
+ case 'not':
+ node.children.each(walk);
+ break;
+
+ case 'before':
+ case 'after':
+ case 'first-line':
+ case 'first-letter':
+ C++;
+ break;
+
+ // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has()
+ default:
+ B++;
+ }
+ break;
+
+ case 'PseudoElementSelector':
+ C++;
+ break;
+
+ case 'TypeSelector':
+ // ignore universal selector
+ if (node.name.charAt(node.name.length - 1) !== '*') {
+ C++;
+ }
+ break;
+
+ }
+ });
+
+ return [A, B, C];
+ };
+
+ var generate$1 = csstree_min.generate;
+
+
+ var nonFreezePseudoElements = {
+ 'first-letter': true,
+ 'first-line': true,
+ 'after': true,
+ 'before': true
+ };
+ var nonFreezePseudoClasses = {
+ 'link': true,
+ 'visited': true,
+ 'hover': true,
+ 'active': true,
+ 'first-letter': true,
+ 'first-line': true,
+ 'after': true,
+ 'before': true
+ };
+
+ var processSelector = function freeze(node, usageData) {
+ var pseudos = Object.create(null);
+ var hasPseudo = false;
+
+ node.prelude.children.each(function(simpleSelector) {
+ var tagName = '*';
+ var scope = 0;
+
+ simpleSelector.children.each(function(node) {
+ switch (node.type) {
+ case 'ClassSelector':
+ if (usageData && usageData.scopes) {
+ var classScope = usageData.scopes[node.name] || 0;
+
+ if (scope !== 0 && classScope !== scope) {
+ throw new Error('Selector can\'t has classes from different scopes: ' + generate$1(simpleSelector));
+ }
+
+ scope = classScope;
+ }
+ break;
+
+ case 'PseudoClassSelector':
+ var name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoClasses.hasOwnProperty(name)) {
+ pseudos[':' + name] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'PseudoElementSelector':
+ var name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoElements.hasOwnProperty(name)) {
+ pseudos['::' + name] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'TypeSelector':
+ tagName = node.name.toLowerCase();
+ break;
+
+ case 'AttributeSelector':
+ if (node.flags) {
+ pseudos['[' + node.flags.toLowerCase() + ']'] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'WhiteSpace':
+ case 'Combinator':
+ tagName = '*';
+ break;
+ }
+ });
+
+ simpleSelector.compareMarker = specificity(simpleSelector).toString();
+ simpleSelector.id = null; // pre-init property to avoid multiple hidden class
+ simpleSelector.id = generate$1(simpleSelector);
+
+ if (scope) {
+ simpleSelector.compareMarker += ':' + scope;
+ }
+
+ if (tagName !== '*') {
+ simpleSelector.compareMarker += ',' + tagName;
+ }
+ });
+
+ // add property to all rule nodes to avoid multiple hidden class
+ node.pseudoSignature = hasPseudo && Object.keys(pseudos).sort().join(',');
+ };
+
+ var resolveKeyword$2 = csstree_min.keyword;
+ var walk$3 = csstree_min.walk;
+ var generate$2 = csstree_min.generate;
+
+
+
+ var prepare = function prepare(ast, options) {
+ var markDeclaration = createDeclarationIndexer();
+
+ walk$3(ast, {
+ visit: 'Rule',
+ enter: function processRule(node) {
+ node.block.children.each(markDeclaration);
+ processSelector(node, options.usage);
+ }
+ });
+
+ walk$3(ast, {
+ visit: 'Atrule',
+ enter: function(node) {
+ if (node.prelude) {
+ node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate
+ node.prelude.id = generate$2(node.prelude);
+ }
+
+ // compare keyframe selectors by its values
+ // NOTE: still no clarification about problems with keyframes selector grouping (issue #197)
+ if (resolveKeyword$2(node.name).basename === 'keyframes') {
+ node.block.avoidRulesMerge = true; /* probably we don't need to prevent those merges for @keyframes
+ TODO: need to be checked */
+ node.block.children.each(function(rule) {
+ rule.prelude.children.each(function(simpleselector) {
+ simpleselector.compareMarker = simpleselector.id;
+ });
+ });
+ }
+ }
+ });
+
+ return {
+ declaration: markDeclaration
+ };
+ };
+
+ var List$1 = csstree_min.List;
+ var resolveKeyword$3 = csstree_min.keyword;
+ var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+ var walk$4 = csstree_min.walk;
+
+ function addRuleToMap(map, item, list, single) {
+ var node = item.data;
+ var name = resolveKeyword$3(node.name).basename;
+ var id = node.name.toLowerCase() + '/' + (node.prelude ? node.prelude.id : null);
+
+ if (!hasOwnProperty$2.call(map, name)) {
+ map[name] = Object.create(null);
+ }
+
+ if (single) {
+ delete map[name][id];
+ }
+
+ if (!hasOwnProperty$2.call(map[name], id)) {
+ map[name][id] = new List$1();
+ }
+
+ map[name][id].append(list.remove(item));
+ }
+
+ function relocateAtrules(ast, options) {
+ var collected = Object.create(null);
+ var topInjectPoint = null;
+
+ ast.children.each(function(node, item, list) {
+ if (node.type === 'Atrule') {
+ var name = resolveKeyword$3(node.name).basename;
+
+ switch (name) {
+ case 'keyframes':
+ addRuleToMap(collected, item, list, true);
+ return;
+
+ case 'media':
+ if (options.forceMediaMerge) {
+ addRuleToMap(collected, item, list, false);
+ return;
+ }
+ break;
+ }
+
+ if (topInjectPoint === null &&
+ name !== 'charset' &&
+ name !== 'import') {
+ topInjectPoint = item;
+ }
+ } else {
+ if (topInjectPoint === null) {
+ topInjectPoint = item;
+ }
+ }
+ });
+
+ for (var atrule in collected) {
+ for (var id in collected[atrule]) {
+ ast.children.insertList(
+ collected[atrule][id],
+ atrule === 'media' ? null : topInjectPoint
+ );
+ }
+ }
+ }
+ function isMediaRule(node) {
+ return node.type === 'Atrule' && node.name === 'media';
+ }
+
+ function processAtrule(node, item, list) {
+ if (!isMediaRule(node)) {
+ return;
+ }
+
+ var prev = item.prev && item.prev.data;
+
+ if (!prev || !isMediaRule(prev)) {
+ return;
+ }
+
+ // merge @media with same query
+ if (node.prelude &&
+ prev.prelude &&
+ node.prelude.id === prev.prelude.id) {
+ prev.block.children.appendList(node.block.children);
+ list.remove(item);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.loc = {
+ // primary: prev.loc,
+ // merged: node.loc
+ // };
+ }
+ }
+
+ var _1MergeAtrule = function rejoinAtrule(ast, options) {
+ relocateAtrules(ast, options);
+
+ walk$4(ast, {
+ visit: 'Atrule',
+ reverse: true,
+ enter: processAtrule
+ });
+ };
+
+ var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
+
+ function isEqualSelectors(a, b) {
+ var cursor1 = a.head;
+ var cursor2 = b.head;
+
+ while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+ cursor1 = cursor1.next;
+ cursor2 = cursor2.next;
+ }
+
+ return cursor1 === null && cursor2 === null;
+ }
+
+ function isEqualDeclarations(a, b) {
+ var cursor1 = a.head;
+ var cursor2 = b.head;
+
+ while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+ cursor1 = cursor1.next;
+ cursor2 = cursor2.next;
+ }
+
+ return cursor1 === null && cursor2 === null;
+ }
+
+ function compareDeclarations(declarations1, declarations2) {
+ var result = {
+ eq: [],
+ ne1: [],
+ ne2: [],
+ ne2overrided: []
+ };
+
+ var fingerprints = Object.create(null);
+ var declarations2hash = Object.create(null);
+
+ for (var cursor = declarations2.head; cursor; cursor = cursor.next) {
+ declarations2hash[cursor.data.id] = true;
+ }
+
+ for (var cursor = declarations1.head; cursor; cursor = cursor.next) {
+ var data = cursor.data;
+
+ if (data.fingerprint) {
+ fingerprints[data.fingerprint] = data.important;
+ }
+
+ if (declarations2hash[data.id]) {
+ declarations2hash[data.id] = false;
+ result.eq.push(data);
+ } else {
+ result.ne1.push(data);
+ }
+ }
+
+ for (var cursor = declarations2.head; cursor; cursor = cursor.next) {
+ var data = cursor.data;
+
+ if (declarations2hash[data.id]) {
+ // when declarations1 has an overriding declaration, this is not a difference
+ // unless no !important is used on prev and !important is used on the following
+ if (!hasOwnProperty$3.call(fingerprints, data.fingerprint) ||
+ (!fingerprints[data.fingerprint] && data.important)) {
+ result.ne2.push(data);
+ }
+
+ result.ne2overrided.push(data);
+ }
+ }
+
+ return result;
+ }
+
+ function addSelectors(dest, source) {
+ source.each(function(sourceData) {
+ var newStr = sourceData.id;
+ var cursor = dest.head;
+
+ while (cursor) {
+ var nextStr = cursor.data.id;
+
+ if (nextStr === newStr) {
+ return;
+ }
+
+ if (nextStr > newStr) {
+ break;
+ }
+
+ cursor = cursor.next;
+ }
+
+ dest.insert(dest.createItem(sourceData), cursor);
+ });
+
+ return dest;
+ }
+
+ // check if simpleselectors has no equal specificity and element selector
+ function hasSimilarSelectors(selectors1, selectors2) {
+ var cursor1 = selectors1.head;
+
+ while (cursor1 !== null) {
+ var cursor2 = selectors2.head;
+
+ while (cursor2 !== null) {
+ if (cursor1.data.compareMarker === cursor2.data.compareMarker) {
+ return true;
+ }
+
+ cursor2 = cursor2.next;
+ }
+
+ cursor1 = cursor1.next;
+ }
+
+ return false;
+ }
+
+ // test node can't to be skipped
+ function unsafeToSkipNode(node) {
+ switch (node.type) {
+ case 'Rule':
+ // unsafe skip ruleset with selector similarities
+ return hasSimilarSelectors(node.prelude.children, this);
+
+ case 'Atrule':
+ // can skip at-rules with blocks
+ if (node.block) {
+ // unsafe skip at-rule if block contains something unsafe to skip
+ return node.block.children.some(unsafeToSkipNode, this);
+ }
+ break;
+
+ case 'Declaration':
+ return false;
+ }
+
+ // unsafe by default
+ return true;
+ }
+
+ var utils$1 = {
+ isEqualSelectors: isEqualSelectors,
+ isEqualDeclarations: isEqualDeclarations,
+ compareDeclarations: compareDeclarations,
+ addSelectors: addSelectors,
+ hasSimilarSelectors: hasSimilarSelectors,
+ unsafeToSkipNode: unsafeToSkipNode
+ };
+
+ var walk$5 = csstree_min.walk;
+
+
+ function processRule(node, item, list) {
+ var selectors = node.prelude.children;
+ var declarations = node.block.children;
+
+ list.prevUntil(item.prev, function(prev) {
+ // skip non-ruleset node if safe
+ if (prev.type !== 'Rule') {
+ return utils$1.unsafeToSkipNode.call(selectors, prev);
+ }
+
+ var prevSelectors = prev.prelude.children;
+ var prevDeclarations = prev.block.children;
+
+ // try to join rulesets with equal pseudo signature
+ if (node.pseudoSignature === prev.pseudoSignature) {
+ // try to join by selectors
+ if (utils$1.isEqualSelectors(prevSelectors, selectors)) {
+ prevDeclarations.appendList(declarations);
+ list.remove(item);
+ return true;
+ }
+
+ // try to join by declarations
+ if (utils$1.isEqualDeclarations(declarations, prevDeclarations)) {
+ utils$1.addSelectors(prevSelectors, selectors);
+ list.remove(item);
+ return true;
+ }
+ }
+
+ // go to prev ruleset if has no selector similarities
+ return utils$1.hasSimilarSelectors(selectors, prevSelectors);
+ });
+ }
+
+ // NOTE: direction should be left to right, since rulesets merge to left
+ // ruleset. When direction right to left unmerged rulesets may prevent lookup
+ // TODO: remove initial merge
+ var _2InitialMergeRuleset = function initialMergeRule(ast) {
+ walk$5(ast, {
+ visit: 'Rule',
+ enter: processRule
+ });
+ };
+
+ var List$2 = csstree_min.List;
+ var walk$6 = csstree_min.walk;
+
+ function processRule$1(node, item, list) {
+ var selectors = node.prelude.children;
+
+ // generate new rule sets:
+ // .a, .b { color: red; }
+ // ->
+ // .a { color: red; }
+ // .b { color: red; }
+
+ // while there are more than 1 simple selector split for rulesets
+ while (selectors.head !== selectors.tail) {
+ var newSelectors = new List$2();
+ newSelectors.insert(selectors.remove(selectors.head));
+
+ list.insert(list.createItem({
+ type: 'Rule',
+ loc: node.loc,
+ prelude: {
+ type: 'SelectorList',
+ loc: node.prelude.loc,
+ children: newSelectors
+ },
+ block: {
+ type: 'Block',
+ loc: node.block.loc,
+ children: node.block.children.copy()
+ },
+ pseudoSignature: node.pseudoSignature
+ }), item);
+ }
+ }
+
+ var _3DisjoinRuleset = function disjoinRule(ast) {
+ walk$6(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: processRule$1
+ });
+ };
+
+ var List$3 = csstree_min.List;
+ var generate$3 = csstree_min.generate;
+ var walk$7 = csstree_min.walk;
+
+ var REPLACE = 1;
+ var REMOVE = 2;
+ var TOP = 0;
+ var RIGHT = 1;
+ var BOTTOM = 2;
+ var LEFT = 3;
+ var SIDES = ['top', 'right', 'bottom', 'left'];
+ var SIDE = {
+ 'margin-top': 'top',
+ 'margin-right': 'right',
+ 'margin-bottom': 'bottom',
+ 'margin-left': 'left',
+
+ 'padding-top': 'top',
+ 'padding-right': 'right',
+ 'padding-bottom': 'bottom',
+ 'padding-left': 'left',
+
+ 'border-top-color': 'top',
+ 'border-right-color': 'right',
+ 'border-bottom-color': 'bottom',
+ 'border-left-color': 'left',
+ 'border-top-width': 'top',
+ 'border-right-width': 'right',
+ 'border-bottom-width': 'bottom',
+ 'border-left-width': 'left',
+ 'border-top-style': 'top',
+ 'border-right-style': 'right',
+ 'border-bottom-style': 'bottom',
+ 'border-left-style': 'left'
+ };
+ var MAIN_PROPERTY = {
+ 'margin': 'margin',
+ 'margin-top': 'margin',
+ 'margin-right': 'margin',
+ 'margin-bottom': 'margin',
+ 'margin-left': 'margin',
+
+ 'padding': 'padding',
+ 'padding-top': 'padding',
+ 'padding-right': 'padding',
+ 'padding-bottom': 'padding',
+ 'padding-left': 'padding',
+
+ 'border-color': 'border-color',
+ 'border-top-color': 'border-color',
+ 'border-right-color': 'border-color',
+ 'border-bottom-color': 'border-color',
+ 'border-left-color': 'border-color',
+ 'border-width': 'border-width',
+ 'border-top-width': 'border-width',
+ 'border-right-width': 'border-width',
+ 'border-bottom-width': 'border-width',
+ 'border-left-width': 'border-width',
+ 'border-style': 'border-style',
+ 'border-top-style': 'border-style',
+ 'border-right-style': 'border-style',
+ 'border-bottom-style': 'border-style',
+ 'border-left-style': 'border-style'
+ };
+
+ function TRBL(name) {
+ this.name = name;
+ this.loc = null;
+ this.iehack = undefined;
+ this.sides = {
+ 'top': null,
+ 'right': null,
+ 'bottom': null,
+ 'left': null
+ };
+ }
+
+ TRBL.prototype.getValueSequence = function(declaration, count) {
+ var values = [];
+ var iehack = '';
+ var hasBadValues = declaration.value.type !== 'Value' || declaration.value.children.some(function(child) {
+ var special = false;
+
+ switch (child.type) {
+ case 'Identifier':
+ switch (child.name) {
+ case '\\0':
+ case '\\9':
+ iehack = child.name;
+ return;
+
+ case 'inherit':
+ case 'initial':
+ case 'unset':
+ case 'revert':
+ special = child.name;
+ break;
+ }
+ break;
+
+ case 'Dimension':
+ switch (child.unit) {
+ // is not supported until IE11
+ case 'rem':
+
+ // v* units is too buggy across browsers and better
+ // don't merge values with those units
+ case 'vw':
+ case 'vh':
+ case 'vmin':
+ case 'vmax':
+ case 'vm': // IE9 supporting "vm" instead of "vmin".
+ special = child.unit;
+ break;
+ }
+ break;
+
+ case 'Hash': // color
+ case 'Number':
+ case 'Percentage':
+ break;
+
+ case 'Function':
+ if (child.name === 'var') {
+ return true;
+ }
+
+ special = child.name;
+ break;
+
+ case 'WhiteSpace':
+ return false; // ignore space
+
+ default:
+ return true; // bad value
+ }
+
+ values.push({
+ node: child,
+ special: special,
+ important: declaration.important
+ });
+ });
+
+ if (hasBadValues || values.length > count) {
+ return false;
+ }
+
+ if (typeof this.iehack === 'string' && this.iehack !== iehack) {
+ return false;
+ }
+
+ this.iehack = iehack; // move outside
+
+ return values;
+ };
+
+ TRBL.prototype.canOverride = function(side, value) {
+ var currentValue = this.sides[side];
+
+ return !currentValue || (value.important && !currentValue.important);
+ };
+
+ TRBL.prototype.add = function(name, declaration) {
+ function attemptToAdd() {
+ var sides = this.sides;
+ var side = SIDE[name];
+
+ if (side) {
+ if (side in sides === false) {
+ return false;
+ }
+
+ var values = this.getValueSequence(declaration, 1);
+
+ if (!values || !values.length) {
+ return false;
+ }
+
+ // can mix only if specials are equal
+ for (var key in sides) {
+ if (sides[key] !== null && sides[key].special !== values[0].special) {
+ return false;
+ }
+ }
+
+ if (!this.canOverride(side, values[0])) {
+ return true;
+ }
+
+ sides[side] = values[0];
+ return true;
+ } else if (name === this.name) {
+ var values = this.getValueSequence(declaration, 4);
+
+ if (!values || !values.length) {
+ return false;
+ }
+
+ switch (values.length) {
+ case 1:
+ values[RIGHT] = values[TOP];
+ values[BOTTOM] = values[TOP];
+ values[LEFT] = values[TOP];
+ break;
+
+ case 2:
+ values[BOTTOM] = values[TOP];
+ values[LEFT] = values[RIGHT];
+ break;
+
+ case 3:
+ values[LEFT] = values[RIGHT];
+ break;
+ }
+
+ // can mix only if specials are equal
+ for (var i = 0; i < 4; i++) {
+ for (var key in sides) {
+ if (sides[key] !== null && sides[key].special !== values[i].special) {
+ return false;
+ }
+ }
+ }
+
+ for (var i = 0; i < 4; i++) {
+ if (this.canOverride(SIDES[i], values[i])) {
+ sides[SIDES[i]] = values[i];
+ }
+ }
+
+ return true;
+ }
+ }
+
+ if (!attemptToAdd.call(this)) {
+ return false;
+ }
+
+ // TODO: use it when we can refer to several points in source
+ // if (this.loc) {
+ // this.loc = {
+ // primary: this.loc,
+ // merged: declaration.loc
+ // };
+ // } else {
+ // this.loc = declaration.loc;
+ // }
+ if (!this.loc) {
+ this.loc = declaration.loc;
+ }
+
+ return true;
+ };
+
+ TRBL.prototype.isOkToMinimize = function() {
+ var top = this.sides.top;
+ var right = this.sides.right;
+ var bottom = this.sides.bottom;
+ var left = this.sides.left;
+
+ if (top && right && bottom && left) {
+ var important =
+ top.important +
+ right.important +
+ bottom.important +
+ left.important;
+
+ return important === 0 || important === 4;
+ }
+
+ return false;
+ };
+
+ TRBL.prototype.getValue = function() {
+ var result = new List$3();
+ var sides = this.sides;
+ var values = [
+ sides.top,
+ sides.right,
+ sides.bottom,
+ sides.left
+ ];
+ var stringValues = [
+ generate$3(sides.top.node),
+ generate$3(sides.right.node),
+ generate$3(sides.bottom.node),
+ generate$3(sides.left.node)
+ ];
+
+ if (stringValues[LEFT] === stringValues[RIGHT]) {
+ values.pop();
+ if (stringValues[BOTTOM] === stringValues[TOP]) {
+ values.pop();
+ if (stringValues[RIGHT] === stringValues[TOP]) {
+ values.pop();
+ }
+ }
+ }
+
+ for (var i = 0; i < values.length; i++) {
+ if (i) {
+ result.appendData({ type: 'WhiteSpace', value: ' ' });
+ }
+
+ result.appendData(values[i].node);
+ }
+
+ if (this.iehack) {
+ result.appendData({ type: 'WhiteSpace', value: ' ' });
+ result.appendData({
+ type: 'Identifier',
+ loc: null,
+ name: this.iehack
+ });
+ }
+
+ return {
+ type: 'Value',
+ loc: null,
+ children: result
+ };
+ };
+
+ TRBL.prototype.getDeclaration = function() {
+ return {
+ type: 'Declaration',
+ loc: this.loc,
+ important: this.sides.top.important,
+ property: this.name,
+ value: this.getValue()
+ };
+ };
+
+ function processRule$2(rule, shorts, shortDeclarations, lastShortSelector) {
+ var declarations = rule.block.children;
+ var selector = rule.prelude.children.first().id;
+
+ rule.block.children.eachRight(function(declaration, item) {
+ var property = declaration.property;
+
+ if (!MAIN_PROPERTY.hasOwnProperty(property)) {
+ return;
+ }
+
+ var key = MAIN_PROPERTY[property];
+ var shorthand;
+ var operation;
+
+ if (!lastShortSelector || selector === lastShortSelector) {
+ if (key in shorts) {
+ operation = REMOVE;
+ shorthand = shorts[key];
+ }
+ }
+
+ if (!shorthand || !shorthand.add(property, declaration)) {
+ operation = REPLACE;
+ shorthand = new TRBL(key);
+
+ // if can't parse value ignore it and break shorthand children
+ if (!shorthand.add(property, declaration)) {
+ lastShortSelector = null;
+ return;
+ }
+ }
+
+ shorts[key] = shorthand;
+ shortDeclarations.push({
+ operation: operation,
+ block: declarations,
+ item: item,
+ shorthand: shorthand
+ });
+
+ lastShortSelector = selector;
+ });
+
+ return lastShortSelector;
+ }
+
+ function processShorthands(shortDeclarations, markDeclaration) {
+ shortDeclarations.forEach(function(item) {
+ var shorthand = item.shorthand;
+
+ if (!shorthand.isOkToMinimize()) {
+ return;
+ }
+
+ if (item.operation === REPLACE) {
+ item.item.data = markDeclaration(shorthand.getDeclaration());
+ } else {
+ item.block.remove(item.item);
+ }
+ });
+ }
+
+ var _4RestructShorthand = function restructBlock(ast, indexer) {
+ var stylesheetMap = {};
+ var shortDeclarations = [];
+
+ walk$7(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: function(node) {
+ var stylesheet = this.block || this.stylesheet;
+ var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+ var ruleMap;
+ var shorts;
+
+ if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+ ruleMap = {
+ lastShortSelector: null
+ };
+ stylesheetMap[stylesheet.id] = ruleMap;
+ } else {
+ ruleMap = stylesheetMap[stylesheet.id];
+ }
+
+ if (ruleMap.hasOwnProperty(ruleId)) {
+ shorts = ruleMap[ruleId];
+ } else {
+ shorts = {};
+ ruleMap[ruleId] = shorts;
+ }
+
+ ruleMap.lastShortSelector = processRule$2.call(this, node, shorts, shortDeclarations, ruleMap.lastShortSelector);
+ }
+ });
+
+ processShorthands(shortDeclarations, indexer.declaration);
+ };
+
+ var resolveProperty = csstree_min.property;
+ var resolveKeyword$4 = csstree_min.keyword;
+ var walk$8 = csstree_min.walk;
+ var generate$4 = csstree_min.generate;
+ var fingerprintId = 1;
+ var dontRestructure = {
+ 'src': 1 // https://github.com/afelix/csso/issues/50
+ };
+
+ var DONT_MIX_VALUE = {
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/display#Browser_compatibility
+ 'display': /table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,
+ // https://developer.mozilla.org/en/docs/Web/CSS/text-align
+ 'text-align': /^(start|end|match-parent|justify-all)$/i
+ };
+
+ var SAFE_VALUES = {
+ cursor: [
+ 'auto', 'crosshair', 'default', 'move', 'text', 'wait', 'help',
+ 'n-resize', 'e-resize', 's-resize', 'w-resize',
+ 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize',
+ 'pointer', 'progress', 'not-allowed', 'no-drop', 'vertical-text', 'all-scroll',
+ 'col-resize', 'row-resize'
+ ],
+ overflow: [
+ 'hidden', 'visible', 'scroll', 'auto'
+ ],
+ position: [
+ 'static', 'relative', 'absolute', 'fixed'
+ ]
+ };
+
+ var NEEDLESS_TABLE = {
+ 'border-width': ['border'],
+ 'border-style': ['border'],
+ 'border-color': ['border'],
+ 'border-top': ['border'],
+ 'border-right': ['border'],
+ 'border-bottom': ['border'],
+ 'border-left': ['border'],
+ 'border-top-width': ['border-top', 'border-width', 'border'],
+ 'border-right-width': ['border-right', 'border-width', 'border'],
+ 'border-bottom-width': ['border-bottom', 'border-width', 'border'],
+ 'border-left-width': ['border-left', 'border-width', 'border'],
+ 'border-top-style': ['border-top', 'border-style', 'border'],
+ 'border-right-style': ['border-right', 'border-style', 'border'],
+ 'border-bottom-style': ['border-bottom', 'border-style', 'border'],
+ 'border-left-style': ['border-left', 'border-style', 'border'],
+ 'border-top-color': ['border-top', 'border-color', 'border'],
+ 'border-right-color': ['border-right', 'border-color', 'border'],
+ 'border-bottom-color': ['border-bottom', 'border-color', 'border'],
+ 'border-left-color': ['border-left', 'border-color', 'border'],
+ 'margin-top': ['margin'],
+ 'margin-right': ['margin'],
+ 'margin-bottom': ['margin'],
+ 'margin-left': ['margin'],
+ 'padding-top': ['padding'],
+ 'padding-right': ['padding'],
+ 'padding-bottom': ['padding'],
+ 'padding-left': ['padding'],
+ 'font-style': ['font'],
+ 'font-variant': ['font'],
+ 'font-weight': ['font'],
+ 'font-size': ['font'],
+ 'font-family': ['font'],
+ 'list-style-type': ['list-style'],
+ 'list-style-position': ['list-style'],
+ 'list-style-image': ['list-style']
+ };
+
+ function getPropertyFingerprint(propertyName, declaration, fingerprints) {
+ var realName = resolveProperty(propertyName).basename;
+
+ if (realName === 'background') {
+ return propertyName + ':' + generate$4(declaration.value);
+ }
+
+ var declarationId = declaration.id;
+ var fingerprint = fingerprints[declarationId];
+
+ if (!fingerprint) {
+ switch (declaration.value.type) {
+ case 'Value':
+ var vendorId = '';
+ var iehack = '';
+ var special = {};
+ var raw = false;
+
+ declaration.value.children.each(function walk(node) {
+ switch (node.type) {
+ case 'Value':
+ case 'Brackets':
+ case 'Parentheses':
+ node.children.each(walk);
+ break;
+
+ case 'Raw':
+ raw = true;
+ break;
+
+ case 'Identifier':
+ var name = node.name;
+
+ if (!vendorId) {
+ vendorId = resolveKeyword$4(name).vendor;
+ }
+
+ if (/\\[09]/.test(name)) {
+ iehack = RegExp.lastMatch;
+ }
+
+ if (SAFE_VALUES.hasOwnProperty(realName)) {
+ if (SAFE_VALUES[realName].indexOf(name) === -1) {
+ special[name] = true;
+ }
+ } else if (DONT_MIX_VALUE.hasOwnProperty(realName)) {
+ if (DONT_MIX_VALUE[realName].test(name)) {
+ special[name] = true;
+ }
+ }
+
+ break;
+
+ case 'Function':
+ var name = node.name;
+
+ if (!vendorId) {
+ vendorId = resolveKeyword$4(name).vendor;
+ }
+
+ if (name === 'rect') {
+ // there are 2 forms of rect:
+ // rect(<top>, <right>, <bottom>, <left>) - standart
+ // rect(<top> <right> <bottom> <left>) – backwards compatible syntax
+ // only the same form values can be merged
+ var hasComma = node.children.some(function(node) {
+ return node.type === 'Operator' && node.value === ',';
+ });
+ if (!hasComma) {
+ name = 'rect-backward';
+ }
+ }
+
+ special[name + '()'] = true;
+
+ // check nested tokens too
+ node.children.each(walk);
+
+ break;
+
+ case 'Dimension':
+ var unit = node.unit;
+
+ if (/\\[09]/.test(unit)) {
+ iehack = RegExp.lastMatch;
+ }
+
+ switch (unit) {
+ // is not supported until IE11
+ case 'rem':
+
+ // v* units is too buggy across browsers and better
+ // don't merge values with those units
+ case 'vw':
+ case 'vh':
+ case 'vmin':
+ case 'vmax':
+ case 'vm': // IE9 supporting "vm" instead of "vmin".
+ special[unit] = true;
+ break;
+ }
+ break;
+ }
+ });
+
+ fingerprint = raw
+ ? '!' + fingerprintId++
+ : '!' + Object.keys(special).sort() + '|' + iehack + vendorId;
+ break;
+
+ case 'Raw':
+ fingerprint = '!' + declaration.value.value;
+ break;
+
+ default:
+ fingerprint = generate$4(declaration.value);
+ }
+
+ fingerprints[declarationId] = fingerprint;
+ }
+
+ return propertyName + fingerprint;
+ }
+
+ function needless(props, declaration, fingerprints) {
+ var property = resolveProperty(declaration.property);
+
+ if (NEEDLESS_TABLE.hasOwnProperty(property.basename)) {
+ var table = NEEDLESS_TABLE[property.basename];
+
+ for (var i = 0; i < table.length; i++) {
+ var ppre = getPropertyFingerprint(property.prefix + table[i], declaration, fingerprints);
+ var prev = props.hasOwnProperty(ppre) ? props[ppre] : null;
+
+ if (prev && (!declaration.important || prev.item.data.important)) {
+ return prev;
+ }
+ }
+ }
+ }
+
+ function processRule$3(rule, item, list, props, fingerprints) {
+ var declarations = rule.block.children;
+
+ declarations.eachRight(function(declaration, declarationItem) {
+ var property = declaration.property;
+ var fingerprint = getPropertyFingerprint(property, declaration, fingerprints);
+ var prev = props[fingerprint];
+
+ if (prev && !dontRestructure.hasOwnProperty(property)) {
+ if (declaration.important && !prev.item.data.important) {
+ props[fingerprint] = {
+ block: declarations,
+ item: declarationItem
+ };
+
+ prev.block.remove(prev.item);
+
+ // TODO: use it when we can refer to several points in source
+ // declaration.loc = {
+ // primary: declaration.loc,
+ // merged: prev.item.data.loc
+ // };
+ } else {
+ declarations.remove(declarationItem);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.item.data.loc = {
+ // primary: prev.item.data.loc,
+ // merged: declaration.loc
+ // };
+ }
+ } else {
+ var prev = needless(props, declaration, fingerprints);
+
+ if (prev) {
+ declarations.remove(declarationItem);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.item.data.loc = {
+ // primary: prev.item.data.loc,
+ // merged: declaration.loc
+ // };
+ } else {
+ declaration.fingerprint = fingerprint;
+
+ props[fingerprint] = {
+ block: declarations,
+ item: declarationItem
+ };
+ }
+ }
+ });
+
+ if (declarations.isEmpty()) {
+ list.remove(item);
+ }
+ }
+
+ var _6RestructBlock = function restructBlock(ast) {
+ var stylesheetMap = {};
+ var fingerprints = Object.create(null);
+
+ walk$8(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: function(node, item, list) {
+ var stylesheet = this.block || this.stylesheet;
+ var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+ var ruleMap;
+ var props;
+
+ if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+ ruleMap = {};
+ stylesheetMap[stylesheet.id] = ruleMap;
+ } else {
+ ruleMap = stylesheetMap[stylesheet.id];
+ }
+
+ if (ruleMap.hasOwnProperty(ruleId)) {
+ props = ruleMap[ruleId];
+ } else {
+ props = {};
+ ruleMap[ruleId] = props;
+ }
+
+ processRule$3.call(this, node, item, list, props, fingerprints);
+ }
+ });
+ };
+
+ var walk$9 = csstree_min.walk;
+
+
+ /*
+ At this step all rules has single simple selector. We try to join by equal
+ declaration blocks to first rule, e.g.
+
+ .a { color: red }
+ b { ... }
+ .b { color: red }
+ ->
+ .a, .b { color: red }
+ b { ... }
+ */
+
+ function processRule$4(node, item, list) {
+ var selectors = node.prelude.children;
+ var declarations = node.block.children;
+ var nodeCompareMarker = selectors.first().compareMarker;
+ var skippedCompareMarkers = {};
+
+ list.nextUntil(item.next, function(next, nextItem) {
+ // skip non-ruleset node if safe
+ if (next.type !== 'Rule') {
+ return utils$1.unsafeToSkipNode.call(selectors, next);
+ }
+
+ if (node.pseudoSignature !== next.pseudoSignature) {
+ return true;
+ }
+
+ var nextFirstSelector = next.prelude.children.head;
+ var nextDeclarations = next.block.children;
+ var nextCompareMarker = nextFirstSelector.data.compareMarker;
+
+ // if next ruleset has same marked as one of skipped then stop joining
+ if (nextCompareMarker in skippedCompareMarkers) {
+ return true;
+ }
+
+ // try to join by selectors
+ if (selectors.head === selectors.tail) {
+ if (selectors.first().id === nextFirstSelector.data.id) {
+ declarations.appendList(nextDeclarations);
+ list.remove(nextItem);
+ return;
+ }
+ }
+
+ // try to join by properties
+ if (utils$1.isEqualDeclarations(declarations, nextDeclarations)) {
+ var nextStr = nextFirstSelector.data.id;
+
+ selectors.some(function(data, item) {
+ var curStr = data.id;
+
+ if (nextStr < curStr) {
+ selectors.insert(nextFirstSelector, item);
+ return true;
+ }
+
+ if (!item.next) {
+ selectors.insert(nextFirstSelector);
+ return true;
+ }
+ });
+
+ list.remove(nextItem);
+ return;
+ }
+
+ // go to next ruleset if current one can be skipped (has no equal specificity nor element selector)
+ if (nextCompareMarker === nodeCompareMarker) {
+ return true;
+ }
+
+ skippedCompareMarkers[nextCompareMarker] = true;
+ });
+ }
+
+ var _7MergeRuleset = function mergeRule(ast) {
+ walk$9(ast, {
+ visit: 'Rule',
+ enter: processRule$4
+ });
+ };
+
+ var List$4 = csstree_min.List;
+ var walk$a = csstree_min.walk;
+
+
+ function calcSelectorLength(list) {
+ var length = 0;
+
+ list.each(function(data) {
+ length += data.id.length + 1;
+ });
+
+ return length - 1;
+ }
+
+ function calcDeclarationsLength(tokens) {
+ var length = 0;
+
+ for (var i = 0; i < tokens.length; i++) {
+ length += tokens[i].length;
+ }
+
+ return (
+ length + // declarations
+ tokens.length - 1 // delimeters
+ );
+ }
+
+ function processRule$5(node, item, list) {
+ var avoidRulesMerge = this.block !== null ? this.block.avoidRulesMerge : false;
+ var selectors = node.prelude.children;
+ var block = node.block;
+ var disallowDownMarkers = Object.create(null);
+ var allowMergeUp = true;
+ var allowMergeDown = true;
+
+ list.prevUntil(item.prev, function(prev, prevItem) {
+ var prevBlock = prev.block;
+ var prevType = prev.type;
+
+ if (prevType !== 'Rule') {
+ var unsafe = utils$1.unsafeToSkipNode.call(selectors, prev);
+
+ if (!unsafe && prevType === 'Atrule' && prevBlock) {
+ walk$a(prevBlock, {
+ visit: 'Rule',
+ enter: function(node) {
+ node.prelude.children.each(function(data) {
+ disallowDownMarkers[data.compareMarker] = true;
+ });
+ }
+ });
+ }
+
+ return unsafe;
+ }
+
+ var prevSelectors = prev.prelude.children;
+
+ if (node.pseudoSignature !== prev.pseudoSignature) {
+ return true;
+ }
+
+ allowMergeDown = !prevSelectors.some(function(selector) {
+ return selector.compareMarker in disallowDownMarkers;
+ });
+
+ // try prev ruleset if simpleselectors has no equal specifity and element selector
+ if (!allowMergeDown && !allowMergeUp) {
+ return true;
+ }
+
+ // try to join by selectors
+ if (allowMergeUp && utils$1.isEqualSelectors(prevSelectors, selectors)) {
+ prevBlock.children.appendList(block.children);
+ list.remove(item);
+ return true;
+ }
+
+ // try to join by properties
+ var diff = utils$1.compareDeclarations(block.children, prevBlock.children);
+
+ // console.log(diff.eq, diff.ne1, diff.ne2);
+
+ if (diff.eq.length) {
+ if (!diff.ne1.length && !diff.ne2.length) {
+ // equal blocks
+ if (allowMergeDown) {
+ utils$1.addSelectors(selectors, prevSelectors);
+ list.remove(prevItem);
+ }
+
+ return true;
+ } else if (!avoidRulesMerge) { /* probably we don't need to prevent those merges for @keyframes
+ TODO: need to be checked */
+
+ if (diff.ne1.length && !diff.ne2.length) {
+ // prevBlock is subset block
+ var selectorLength = calcSelectorLength(selectors);
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ if (allowMergeUp && selectorLength < blockLength) {
+ utils$1.addSelectors(prevSelectors, selectors);
+ block.children = new List$4().fromArray(diff.ne1);
+ }
+ } else if (!diff.ne1.length && diff.ne2.length) {
+ // node is subset of prevBlock
+ var selectorLength = calcSelectorLength(prevSelectors);
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ if (allowMergeDown && selectorLength < blockLength) {
+ utils$1.addSelectors(selectors, prevSelectors);
+ prevBlock.children = new List$4().fromArray(diff.ne2);
+ }
+ } else {
+ // diff.ne1.length && diff.ne2.length
+ // extract equal block
+ var newSelector = {
+ type: 'SelectorList',
+ loc: null,
+ children: utils$1.addSelectors(prevSelectors.copy(), selectors)
+ };
+ var newBlockLength = calcSelectorLength(newSelector.children) + 2; // selectors length + curly braces length
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ // create new ruleset if declarations length greater than
+ // ruleset description overhead
+ if (blockLength >= newBlockLength) {
+ var newItem = list.createItem({
+ type: 'Rule',
+ loc: null,
+ prelude: newSelector,
+ block: {
+ type: 'Block',
+ loc: null,
+ children: new List$4().fromArray(diff.eq)
+ },
+ pseudoSignature: node.pseudoSignature
+ });
+
+ block.children = new List$4().fromArray(diff.ne1);
+ prevBlock.children = new List$4().fromArray(diff.ne2overrided);
+
+ if (allowMergeUp) {
+ list.insert(newItem, prevItem);
+ } else {
+ list.insert(newItem, item);
+ }
+
+ return true;
+ }
+ }
+ }
+ }
+
+ if (allowMergeUp) {
+ // TODO: disallow up merge only if any property interception only (i.e. diff.ne2overrided.length > 0);
+ // await property families to find property interception correctly
+ allowMergeUp = !prevSelectors.some(function(prevSelector) {
+ return selectors.some(function(selector) {
+ return selector.compareMarker === prevSelector.compareMarker;
+ });
+ });
+ }
+
+ prevSelectors.each(function(data) {
+ disallowDownMarkers[data.compareMarker] = true;
+ });
+ });
+ }
+
+ var _8RestructRuleset = function restructRule(ast) {
+ walk$a(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: processRule$5
+ });
+ };
+
+ var restructure = function(ast, options) {
+ // prepare ast for restructing
+ var indexer = prepare(ast, options);
+ options.logger('prepare', ast);
+
+ _1MergeAtrule(ast, options);
+ options.logger('mergeAtrule', ast);
+
+ _2InitialMergeRuleset(ast);
+ options.logger('initialMergeRuleset', ast);
+
+ _3DisjoinRuleset(ast);
+ options.logger('disjoinRuleset', ast);
+
+ _4RestructShorthand(ast, indexer);
+ options.logger('restructShorthand', ast);
+
+ _6RestructBlock(ast);
+ options.logger('restructBlock', ast);
+
+ _7MergeRuleset(ast);
+ options.logger('mergeRuleset', ast);
+
+ _8RestructRuleset(ast);
+ options.logger('restructRuleset', ast);
+ };
+
+ var List$5 = csstree_min.List;
+ var clone = csstree_min.clone;
+
+
+
+
+ var walk$b = csstree_min.walk;
+
+ function readChunk(children, specialComments) {
+ var buffer = new List$5();
+ var nonSpaceTokenInBuffer = false;
+ var protectedComment;
+
+ children.nextUntil(children.head, function(node, item, list) {
+ if (node.type === 'Comment') {
+ if (!specialComments || node.value.charAt(0) !== '!') {
+ list.remove(item);
+ return;
+ }
+
+ if (nonSpaceTokenInBuffer || protectedComment) {
+ return true;
+ }
+
+ list.remove(item);
+ protectedComment = node;
+ return;
+ }
+
+ if (node.type !== 'WhiteSpace') {
+ nonSpaceTokenInBuffer = true;
+ }
+
+ buffer.insert(list.remove(item));
+ });
+
+ return {
+ comment: protectedComment,
+ stylesheet: {
+ type: 'StyleSheet',
+ loc: null,
+ children: buffer
+ }
+ };
+ }
+
+ function compressChunk(ast, firstAtrulesAllowed, num, options) {
+ options.logger('Compress block #' + num, null, true);
+
+ var seed = 1;
+
+ if (ast.type === 'StyleSheet') {
+ ast.firstAtrulesAllowed = firstAtrulesAllowed;
+ ast.id = seed++;
+ }
+
+ walk$b(ast, {
+ visit: 'Atrule',
+ enter: function markScopes(node) {
+ if (node.block !== null) {
+ node.block.id = seed++;
+ }
+ }
+ });
+ options.logger('init', ast);
+
+ // remove redundant
+ clean(ast, options);
+ options.logger('clean', ast);
+
+ // replace nodes for shortened forms
+ replace(ast);
+ options.logger('replace', ast);
+
+ // structure optimisations
+ if (options.restructuring) {
+ restructure(ast, options);
+ }
+
+ return ast;
+ }
+
+ function getCommentsOption(options) {
+ var comments = 'comments' in options ? options.comments : 'exclamation';
+
+ if (typeof comments === 'boolean') {
+ comments = comments ? 'exclamation' : false;
+ } else if (comments !== 'exclamation' && comments !== 'first-exclamation') {
+ comments = false;
+ }
+
+ return comments;
+ }
+
+ function getRestructureOption(options) {
+ if ('restructure' in options) {
+ return options.restructure;
+ }
+
+ return 'restructuring' in options ? options.restructuring : true;
+ }
+
+ function wrapBlock(block) {
+ return new List$5().appendData({
+ type: 'Rule',
+ loc: null,
+ prelude: {
+ type: 'SelectorList',
+ loc: null,
+ children: new List$5().appendData({
+ type: 'Selector',
+ loc: null,
+ children: new List$5().appendData({
+ type: 'TypeSelector',
+ loc: null,
+ name: 'x'
+ })
+ })
+ },
+ block: block
+ });
+ }
+
+ var compress = function compress(ast, options) {
+ ast = ast || { type: 'StyleSheet', loc: null, children: new List$5() };
+ options = options || {};
+
+ var compressOptions = {
+ logger: typeof options.logger === 'function' ? options.logger : function() {},
+ restructuring: getRestructureOption(options),
+ forceMediaMerge: Boolean(options.forceMediaMerge),
+ usage: options.usage ? usage.buildIndex(options.usage) : false
+ };
+ var specialComments = getCommentsOption(options);
+ var firstAtrulesAllowed = true;
+ var input;
+ var output = new List$5();
+ var chunk;
+ var chunkNum = 1;
+ var chunkChildren;
+
+ if (options.clone) {
+ ast = clone(ast);
+ }
+
+ if (ast.type === 'StyleSheet') {
+ input = ast.children;
+ ast.children = output;
+ } else {
+ input = wrapBlock(ast);
+ }
+
+ do {
+ chunk = readChunk(input, Boolean(specialComments));
+ compressChunk(chunk.stylesheet, firstAtrulesAllowed, chunkNum++, compressOptions);
+ chunkChildren = chunk.stylesheet.children;
+
+ if (chunk.comment) {
+ // add \n before comment if there is another content in output
+ if (!output.isEmpty()) {
+ output.insert(List$5.createItem({
+ type: 'Raw',
+ value: '\n'
+ }));
+ }
+
+ output.insert(List$5.createItem(chunk.comment));
+
+ // add \n after comment if chunk is not empty
+ if (!chunkChildren.isEmpty()) {
+ output.insert(List$5.createItem({
+ type: 'Raw',
+ value: '\n'
+ }));
+ }
+ }
+
+ if (firstAtrulesAllowed && !chunkChildren.isEmpty()) {
+ var lastRule = chunkChildren.last();
+
+ if (lastRule.type !== 'Atrule' ||
+ (lastRule.name !== 'import' && lastRule.name !== 'charset')) {
+ firstAtrulesAllowed = false;
+ }
+ }
+
+ if (specialComments !== 'exclamation') {
+ specialComments = false;
+ }
+
+ output.appendList(chunkChildren);
+ } while (!input.isEmpty());
+
+ return {
+ ast: ast
+ };
+ };
+
+ var version = "4.2.0";
+ var _package = {
+ version: version
+ };
+
+ var _package$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ version: version,
+ 'default': _package
+ });
+
+ var require$$0 = getCjsExportFromNamespace(_package$1);
+
+ var parse = csstree_min.parse;
+
+ var generate$5 = csstree_min.generate;
+
+ function debugOutput(name, options, startTime, data) {
+ if (options.debug) {
+ console.error('## ' + name + ' done in %d ms\n', Date.now() - startTime);
+ }
+
+ return data;
+ }
+
+ function createDefaultLogger(level) {
+ var lastDebug;
+
+ return function logger(title, ast) {
+ var line = title;
+
+ if (ast) {
+ line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;
+ }
+
+ if (level > 1 && ast) {
+ var css = generate$5(ast);
+
+ // when level 2, limit css to 256 symbols
+ if (level === 2 && css.length > 256) {
+ css = css.substr(0, 256) + '...';
+ }
+
+ line += '\n ' + css + '\n';
+ }
+
+ console.error(line);
+ lastDebug = Date.now();
+ };
+ }
+
+ function copy(obj) {
+ var result = {};
+
+ for (var key in obj) {
+ result[key] = obj[key];
+ }
+
+ return result;
+ }
+
+ function buildCompressOptions(options) {
+ options = copy(options);
+
+ if (typeof options.logger !== 'function' && options.debug) {
+ options.logger = createDefaultLogger(options.debug);
+ }
+
+ return options;
+ }
+
+ function runHandler(ast, options, handlers) {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+
+ handlers.forEach(function(fn) {
+ fn(ast, options);
+ });
+ }
+
+ function minify(context, source, options) {
+ options = options || {};
+
+ var filename = options.filename || '<unknown>';
+ var result;
+
+ // parse
+ var ast = debugOutput('parsing', options, Date.now(),
+ parse(source, {
+ context: context,
+ filename: filename,
+ positions: Boolean(options.sourceMap)
+ })
+ );
+
+ // before compress handlers
+ if (options.beforeCompress) {
+ debugOutput('beforeCompress', options, Date.now(),
+ runHandler(ast, options, options.beforeCompress)
+ );
+ }
+
+ // compress
+ var compressResult = debugOutput('compress', options, Date.now(),
+ compress(ast, buildCompressOptions(options))
+ );
+
+ // after compress handlers
+ if (options.afterCompress) {
+ debugOutput('afterCompress', options, Date.now(),
+ runHandler(compressResult, options, options.afterCompress)
+ );
+ }
+
+ // generate
+ if (options.sourceMap) {
+ result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {
+ var tmp = generate$5(compressResult.ast, { sourceMap: true });
+ tmp.map._file = filename; // since other tools can relay on file in source map transform chain
+ tmp.map.setSourceContent(filename, source);
+ return tmp;
+ }()));
+ } else {
+ result = debugOutput('generate', options, Date.now(), {
+ css: generate$5(compressResult.ast),
+ map: null
+ });
+ }
+
+ return result;
+ }
+
+ function minifyStylesheet(source, options) {
+ return minify('stylesheet', source, options);
+ }
+
+ function minifyBlock(source, options) {
+ return minify('declarationList', source, options);
+ }
+
+ var lib = {
+ version: require$$0.version,
+
+ // main methods
+ minify: minifyStylesheet,
+ minifyBlock: minifyBlock,
+
+ // css syntax parser/walkers/generator/etc
+ syntax: Object.assign({
+ compress: compress
+ }, csstree_min)
+ };
+ var lib_1 = lib.version;
+ var lib_2 = lib.minify;
+ var lib_3 = lib.minifyBlock;
+ var lib_4 = lib.syntax;
+
+ exports.default = lib;
+ exports.minify = lib_2;
+ exports.minifyBlock = lib_3;
+ exports.syntax = lib_4;
+ exports.version = lib_1;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/node_modules/csso/dist/csso.min.js b/node_modules/csso/dist/csso.min.js
new file mode 100644
index 0000000..2fe71e5
--- /dev/null
+++ b/node_modules/csso/dist/csso.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).csso={})}(this,(function(e){"use strict";"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var t=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){function e(e){return{prev:null,next:null,data:e}}function t(e,t,n){var a;return null!==r?(a=r,r=r.cursor,a.prev=t,a.next=n,a.cursor=e.cursor):a={prev:t,next:n,cursor:e.cursor},e.cursor=a,a}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t}var r=null,a=function(){this.cursor=null,this.head=null,this.tail=null};a.createItem=e,a.prototype.createItem=e,a.prototype.updateCursors=function(e,t,n,r){for(var a=this.cursor;null!==a;)a.prev===e&&(a.prev=t),a.next===n&&(a.next=r),a=a.cursor},a.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},a.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var a=e(t[r]);null!==n?n.next=a:this.head=a,a.prev=n,n=a}return this.tail=n,this},a.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},a.prototype.toJSON=a.prototype.toArray,a.prototype.isEmpty=function(){return null===this.head},a.prototype.first=function(){return this.head&&this.head.data},a.prototype.last=function(){return this.tail&&this.tail.data},a.prototype.each=function(e,r){var a;void 0===r&&(r=this);for(var i=t(this,null,this.head);null!==i.next;)a=i.next,i.next=a.next,e.call(r,a.data,a,this);n(this)},a.prototype.forEach=a.prototype.each,a.prototype.eachRight=function(e,r){var a;void 0===r&&(r=this);for(var i=t(this,this.tail,null);null!==i.prev;)a=i.prev,i.prev=a.prev,e.call(r,a.data,a,this);n(this)},a.prototype.forEachRight=a.prototype.eachRight,a.prototype.reduce=function(e,r,a){var i;void 0===a&&(a=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)i=o.next,o.next=i.next,s=e.call(a,s,i.data,i,this);return n(this),s},a.prototype.reduceRight=function(e,r,a){var i;void 0===a&&(a=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)i=o.prev,o.prev=i.prev,s=e.call(a,s,i.data,i,this);return n(this),s},a.prototype.nextUntil=function(e,r,a){if(null!==e){var i;void 0===a&&(a=this);for(var o=t(this,null,e);null!==o.next&&(i=o.next,o.next=i.next,!r.call(a,i.data,i,this)););n(this)}},a.prototype.prevUntil=function(e,r,a){if(null!==e){var i;void 0===a&&(a=this);for(var o=t(this,e,null);null!==o.prev&&(i=o.prev,o.prev=i.prev,!r.call(a,i.data,i,this)););n(this)}},a.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return!0;n=n.next}return!1},a.prototype.map=function(e,t){var n=new a,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},a.prototype.filter=function(e,t){var n=new a,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},a.prototype.clear=function(){this.head=null,this.tail=null},a.prototype.copy=function(){for(var t=new a,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},a.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},a.prototype.prependData=function(t){return this.prepend(e(t))},a.prototype.append=function(e){return this.insert(e)},a.prototype.appendData=function(t){return this.insert(e(t))},a.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e)}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},a.prototype.insertData=function(t,n){return this.insert(e(t),n)},a.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else{if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next}if(null!==e.next)e.next.prev=e.prev;else{if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev}return e.prev=null,e.next=null,e},a.prototype.push=function(t){this.insert(e(t))},a.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},a.prototype.unshift=function(t){this.prepend(e(t))},a.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},a.prototype.prependList=function(e){return this.insertList(e,this.head)},a.prototype.appendList=function(e){return this.insertList(e)},a.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},a.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e)};var i=a,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return(r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),a=e.line,i=e.column,o=Math.max(1,a-t)-1,s=Math.min(a+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(i+=(" ".length-1)*(r[a-1].substr(0,i-1).match(/\t/g)||[]).length)>100&&(c=i-60+3,i=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g," "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return[n(o,a),new Array(i+l+2).join("-")+"^",n(a,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,a){var i=o("SyntaxError",e);return i.source=t,i.offset=n,i.line=r,i.column=a,i.sourceFragment=function(e){return s(i,isNaN(e)?0:e)},Object.defineProperty(i,"formattedMessage",{get:function(){return"Parse error: "+i.message+"\n"+s(i,2)}}),i.parseError={offset:n,line:r,column:a},i},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function d(e){return e>=48&&e<=57}function p(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function f(e){return p(e)||m(e)}function g(e){return e>=128}function b(e){return f(e)||g(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function v(e){return 10===e||13===e||12===e}function k(e){return v(e)||32===e||9===e}function w(e,t){return 92===e&&!v(t)&&0!==t}var x=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<x.length;S++)switch(!0){case k(S):x[S]=C.WhiteSpace;break;case d(S):x[S]=C.Digit;break;case b(S):x[S]=C.NameStart;break;case y(S):x[S]=C.NonPrintable;break;default:x[S]=S||C.Eof}function C(e){return e<128?x[e]:C.NameStart}var A={isDigit:d,isHexDigit:function(e){return d(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:p,isLowercaseLetter:m,isLetter:f,isNonAscii:g,isNameStart:b,isName:function(e){return b(e)||d(e)||45===e},isNonPrintable:y,isNewline:v,isWhiteSpace:k,isValidEscape:w,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||w(t,n):!!b(e)||92===e&&w(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?d(t)?2:46===t&&d(n)?3:0:46===e?d(t)?2:0:d(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},z=A.isDigit,P=A.isHexDigit,L=A.isUppercaseLetter,T=A.isName,E=A.isWhiteSpace,O=A.isValidEscape;function D(e,t){return t<e.length?e.charCodeAt(t):0}function I(e,t,n){return 13===n&&10===D(e,t+1)?2:1}function R(e,t,n){var r=e.charCodeAt(t);return L(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&z(e.charCodeAt(t));t++);return t}function B(e,t){if(P(D(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(D(e,t));t++);var r=D(e,t);E(r)&&(t+=I(e,t,r))}return t}var M={consumeEscaped:B,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!T(n)){if(!O(n,D(e,t+1)))break;t=B(e,t)-1}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),z(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&z(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),R(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),z(n)&&(t=N(e,t+1+r+1))}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}O(n,D(e,t+1))&&(t=B(e,t))}return t},cmpChar:R,cmpStr:function(e,t,n,r){if(n-t!==r.length)return!1;if(t<0||n>e.length)return!1;for(var a=t;a<n;a++){var i=e.charCodeAt(a),o=r.charCodeAt(a-t);if(L(i)&&(i|=32),i!==o)return!1}return!0},getNewlineLength:I,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,q=M.cmpStr,W=j.EOF,F=j.WhiteSpace,U=j.Comment,Y=function(){this.offsetAndType=null,this.balance=null,this.reset()};Y.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset},lookupType:function(e){return(e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return(e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return(e+=this.tokenIndex)<this.tokenCount&&q(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,a=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,a)){case 1:break e;case 2:r++;break e;default:a=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n)}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===F;e++,t++);t>0&&this.skip(t)},skipSC:function(){for(;this.tokenType===F||this.tokenType===U;)this.next()},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next())},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length)},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,a=this.offsetAndType[t],i=16777215&a;n=i,e(a>>24,r,i,t)}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,a)=>{e[a]={idx:a,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[a]}}),e}};var H=Y;function V(e){return e}var K=function(e,t){var n=V,r=!1,a=!1;return"function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),a=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),function e(t,n,r,a){var i,o;switch(t.type){case"Group":i=function(t,n,r,a){var i=" "===t.combinator||a?t.combinator:" "+t.combinator+" ",o=t.terms.map((function(t){return e(t,n,r,a)})).join(i);return(t.explicit||r)&&(o=(a||","===o[0]?"[":"[ ")+o+(a?"]":" ]")),o}(t,n,r,a)+(t.disallowEmpty?"!":"");break;case"Multiplier":return e(t.term,n,r,a)+n(0===(o=t).min&&0===o.max?"*":0===o.min&&1===o.max?"?":1===o.min&&0===o.max?o.comma?"#":"+":1===o.min&&1===o.max?"":(o.comma?"#":"")+(o.min===o.max?"{"+o.min+"}":"{"+o.min+","+(0!==o.max?o.max:"")+"}"),t);case"Type":i="<"+t.name+(t.opts?n(function(e){switch(e.type){case"Range":return" ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(t.opts),t.opts):"")+">";break;case"Property":i="<'"+t.name+"'>";break;case"Keyword":i=t.name;break;case"AtKeyword":i="@"+t.name;break;case"Function":i=t.name+"(";break;case"String":case"Token":i=t.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+t.type+"`")}return n(i,t)}(e,n,r,a)};const G={offset:0,line:1,column:1};function $(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Q(n):n:null}function Q({offset:e,line:t,column:n},r){const a={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);a.offset+=r.length,a.line+=e.length-1,a.column=1===e.length?a.column+r.length:e.pop().length+1}return a}var X=Object.prototype.hasOwnProperty,Z=Object.create(null),J=Object.create(null);function ee(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function te(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return""}var ne={keyword:function(e){if(X.call(Z,e))return Z[e];var t=e.toLowerCase();if(X.call(Z,t))return Z[e]=Z[t];var n=ee(t,0),r=n?"":te(t,0);return Z[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(X.call(J,e))return J[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=ee(t,n.length);if(!r&&(t=t.toLowerCase(),X.call(J,t)))return J[e]=J[t];var a=r?"":te(t,n.length),i=t.substr(0,n.length+a.length);return J[e]=Object.freeze({basename:t.substr(i.length),name:t.substr(n.length),hack:n,vendor:a,prefix:i,custom:r})},isCustomProperty:ee,vendorPrefix:te},re="undefined"!=typeof Uint32Array?Uint32Array:Array,ae=function(e,t){return null===e||e.length<t?new re(Math.max(t+1024,16384)):e},ie=h.TYPE,oe=A.isNewline,se=A.isName,le=A.isValidEscape,ce=A.isNumberStart,ue=A.isIdentifierStart,he=A.charCodeCategory,de=A.isBOM,pe=M.cmpStr,me=M.getNewlineLength,fe=M.findWhiteSpaceEnd,ge=M.consumeEscaped,be=M.consumeName,ye=M.consumeNumber,ve=M.consumeBadUrlRemnants;function ke(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=ye(e,h),ue(n(h),n(h+1),n(h+2))?(g=ie.Dimension,void(h=be(e,h))):37===n(h)?(g=ie.Percentage,void h++):void(g=ie.Number)}function a(){const t=h;return h=be(e,h),pe(e,t,h,"url")&&40===n(h)?34===n(h=fe(e,h+1))||39===n(h)?(g=ie.Function,void(h=t+4)):void function(){for(g=ie.Url,h=fe(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(he(t)){case 41:return void h++;case he.Eof:return;case he.WhiteSpace:return 41===n(h=fe(e,h))||h>=e.length?void(h<e.length&&h++):(h=ve(e,h),void(g=ie.BadUrl));case 34:case 39:case 40:case he.NonPrintable:return h=ve(e,h),void(g=ie.BadUrl);case 92:if(le(t,n(h+1))){h=ge(e,h)-1;break}return h=ve(e,h),void(g=ie.BadUrl)}}}():40===n(h)?(g=ie.Function,void h++):void(g=ie.Ident)}function i(t){for(t||(t=n(h++)),g=ie.String;h<e.length;h++){var r=e.charCodeAt(h);switch(he(r)){case t:return void h++;case he.Eof:return;case he.WhiteSpace:if(oe(r))return h+=me(e,h,r),void(g=ie.BadString);break;case 92:if(h===e.length-1)break;var a=n(h+1);oe(a)?h+=me(e,h+1,a):le(r,a)&&(h=ge(e,h)-1)}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=ae(t.offsetAndType,o+1),l=ae(t.balance,o+1),c=0,u=de(n(0)),h=u,d=0,p=0,m=0;h<o;){var f=e.charCodeAt(h),g=0;switch(l[c]=o,he(f)){case he.WhiteSpace:g=ie.WhiteSpace,h=fe(e,h+1);break;case 34:i();break;case 35:se(n(h+1))||le(n(h+1),n(h+2))?(g=ie.Hash,h=be(e,h+1)):(g=ie.Delim,h++);break;case 39:i();break;case 40:g=ie.LeftParenthesis,h++;break;case 41:g=ie.RightParenthesis,h++;break;case 43:ce(f,n(h+1),n(h+2))?r():(g=ie.Delim,h++);break;case 44:g=ie.Comma,h++;break;case 45:ce(f,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(g=ie.CDC,h+=3):ue(f,n(h+1),n(h+2))?a():(g=ie.Delim,h++);break;case 46:ce(f,n(h+1),n(h+2))?r():(g=ie.Delim,h++);break;case 47:42===n(h+1)?(g=ie.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(g=ie.Delim,h++);break;case 58:g=ie.Colon,h++;break;case 59:g=ie.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(g=ie.CDO,h+=4):(g=ie.Delim,h++);break;case 64:ue(n(h+1),n(h+2),n(h+3))?(g=ie.AtKeyword,h=be(e,h+1)):(g=ie.Delim,h++);break;case 91:g=ie.LeftSquareBracket,h++;break;case 92:le(f,n(h+1))?a():(g=ie.Delim,h++);break;case 93:g=ie.RightSquareBracket,h++;break;case 123:g=ie.LeftCurlyBracket,h++;break;case 125:g=ie.RightCurlyBracket,h++;break;case he.Digit:r();break;case he.NameStart:a();break;case he.Eof:break;default:g=ie.Delim,h++}switch(g){case d:for(d=(p=l[m=16777215&p])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case ie.LeftParenthesis:case ie.Function:l[c]=p,p=(d=ie.RightParenthesis)<<24|c;break;case ie.LeftSquareBracket:l[c]=p,p=(d=ie.RightSquareBracket)<<24|c;break;case ie.LeftCurlyBracket:l[c]=p,p=(d=ie.RightCurlyBracket)<<24|c}s[c++]=g<<24|h}for(s[c]=ie.EOF<<24|h,l[c]=o,l[o]=o;0!==p;)p=l[m=16777215&p],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){ke[e]=h[e]})),Object.keys(A).forEach((function(e){ke[e]=A[e]})),Object.keys(M).forEach((function(e){ke[e]=M[e]}));var we=ke,xe=we.isDigit,Se=we.cmpChar,Ce=we.TYPE,Ae=Ce.Delim,ze=Ce.WhiteSpace,Pe=Ce.Comment,Le=Ce.Ident,Te=Ce.Number,Ee=Ce.Dimension;function Oe(e,t){return null!==e&&e.type===Ae&&e.value.charCodeAt(0)===t}function De(e,t,n){for(;null!==e&&(e.type===ze||e.type===Pe);)e=n(++t);return t}function Ie(e,t,n,r){if(!e)return 0;var a=e.value.charCodeAt(t);if(43===a||45===a){if(n)return 0;t++}for(;t<e.value.length;t++)if(!xe(e.value.charCodeAt(t)))return 0;return r+1}function Re(e,t,n){var r=!1,a=De(e,t,n);if(null===(e=n(a)))return t;if(e.type!==Te){if(!Oe(e,43)&&!Oe(e,45))return t;if(r=!0,a=De(n(++a),a,n),null===(e=n(a))&&e.type!==Te)return 0}if(!r){var i=e.value.charCodeAt(0);if(43!==i&&45!==i)return 0}return Ie(e,r?0:1,r,a)}var Ne=we.isHexDigit,Be=we.cmpChar,Me=we.TYPE,je=Me.Ident,_e=Me.Delim,qe=Me.Number,We=Me.Dimension;function Fe(e,t){return null!==e&&e.type===_e&&e.value.charCodeAt(0)===t}function Ue(e,t){return e.value.charCodeAt(0)===t}function Ye(e,t,n){for(var r=t,a=0;r<e.value.length;r++){var i=e.value.charCodeAt(r);if(45===i&&n&&0!==a)return Ye(e,t+a+1,!1)>0?6:0;if(!Ne(i))return 0;if(++a>6)return 0}return a}function He(e,t,n){if(!e)return 0;for(;Fe(n(t),63);){if(++e>6)return 0;t++}return t}var Ve=we.isIdentifierStart,Ke=we.isHexDigit,Ge=we.isDigit,$e=we.cmpStr,Qe=we.consumeNumber,Xe=we.TYPE,Ze=["unset","initial","inherit"],Je=["calc(","-moz-calc(","-webkit-calc("];function et(e,t){return t<e.length?e.charCodeAt(t):0}function tt(e,t){return $e(e,0,e.length,t)}function nt(e,t){for(var n=0;n<t.length;n++)if(tt(e,t[n]))return!0;return!1}function rt(e,t){return t===e.length-2&&92===e.charCodeAt(t)&&Ge(e.charCodeAt(t+1))}function at(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return!0;if(null!==e.min&&r<e.min)return!0;if(null!==e.max&&r>e.max)return!0}return!1}function it(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ot(e){return function(t,n,r){return null===t?0:t.type===Xe.Function&&nt(t.value,Je)?it(t,n):e(t,n,r)}}function st(e){return function(t){return null===t||t.type!==e?0:1}}function lt(e){return function(t,n,r){if(null===t||t.type!==Xe.Dimension)return 0;var a=Qe(t.value,0);if(null!==e){var i=t.value.indexOf("\\",a),o=-1!==i&&rt(t.value,i)?t.value.substring(a,i):t.value.substr(a);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return at(r,t.value,a)?0:1}}function ct(e){return"function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===Xe.Number&&0===Number(t.value)?1:e(t,n,r)}}var ut={"ident-token":st(Xe.Ident),"function-token":st(Xe.Function),"at-keyword-token":st(Xe.AtKeyword),"hash-token":st(Xe.Hash),"string-token":st(Xe.String),"bad-string-token":st(Xe.BadString),"url-token":st(Xe.Url),"bad-url-token":st(Xe.BadUrl),"delim-token":st(Xe.Delim),"number-token":st(Xe.Number),"percentage-token":st(Xe.Percentage),"dimension-token":st(Xe.Dimension),"whitespace-token":st(Xe.WhiteSpace),"CDO-token":st(Xe.CDO),"CDC-token":st(Xe.CDC),"colon-token":st(Xe.Colon),"semicolon-token":st(Xe.Semicolon),"comma-token":st(Xe.Comma),"[-token":st(Xe.LeftSquareBracket),"]-token":st(Xe.RightSquareBracket),"(-token":st(Xe.LeftParenthesis),")-token":st(Xe.RightParenthesis),"{-token":st(Xe.LeftCurlyBracket),"}-token":st(Xe.RightCurlyBracket),string:st(Xe.String),ident:st(Xe.Ident),"custom-ident":function(e){if(null===e||e.type!==Xe.Ident)return 0;var t=e.value.toLowerCase();return nt(t,Ze)||tt(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==Xe.Ident||45!==et(e.value,0)||45!==et(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==Xe.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Ke(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==Xe.Hash?0:Ve(et(e.value,1),et(e.value,2),et(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Te)return Ie(e,0,!1,n);if(e.type===Le&&45===e.value.charCodeAt(0)){if(!Se(e.value,1,110))return 0;switch(e.value.length){case 2:return Re(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Ie(e,3,!0,n)}}else if(e.type===Le||Oe(e,43)&&t(n+1).type===Le){if(e.type!==Le&&(e=t(++n)),null===e||!Se(e.value,0,110))return 0;switch(e.value.length){case 1:return Re(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Ie(e,2,!0,n)}}else if(e.type===Ee){for(var r=e.value.charCodeAt(0),a=43===r||45===r?1:0,i=a;i<e.value.length&&xe(e.value.charCodeAt(i));i++);return i===a?0:Se(e.value,i,110)?i+1===e.value.length?Re(t(++n),n,t):45!==e.value.charCodeAt(i+1)?0:i+2===e.value.length?(n=De(t(++n),n,t),Ie(e=t(n),0,!0,n)):Ie(e,i+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==je||!Be(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(Fe(e,43))return null===(e=t(++n))?0:e.type===je?He(Ye(e,0,!0),++n,t):Fe(e,63)?He(1,++n,t):0;if(e.type===qe){if(!Ue(e,43))return 0;var r=Ye(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===We||e.type===qe?Ue(e,45)&&Ye(e,1,!1)?n+1:0:He(r,n,t)}return e.type===We&&Ue(e,43)?He(Ye(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,a=e.index;e:do{switch(e.type){case Xe.BadString:case Xe.BadUrl:break e;case Xe.RightCurlyBracket:case Xe.RightParenthesis:case Xe.RightSquareBracket:if(e.balance>e.index||e.balance<a)break e;r--;break;case Xe.Semicolon:if(0===r)break e;break;case Xe.Delim:if("!"===e.value&&0===r)break e;break;case Xe.Function:case Xe.LeftParenthesis:case Xe.LeftSquareBracket:case Xe.LeftCurlyBracket:r++}if(n++,e.balance<=a)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case Xe.BadString:case Xe.BadUrl:break e;case Xe.RightCurlyBracket:case Xe.RightParenthesis:case Xe.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ot(lt(null)),angle:ot(lt({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ot(lt({db:!0})),frequency:ot(lt({hz:!0,khz:!0})),flex:ot(lt({fr:!0})),length:ot(ct(lt({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ot(lt({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ot(lt({st:!0})),time:ot(lt({s:!0,ms:!0})),percentage:ot((function(e,t,n){return null===e||e.type!==Xe.Percentage||at(n,e.value,e.value.length-1)?0:1})),zero:ct(),number:ot((function(e,t,n){if(null===e)return 0;var r=Qe(e.value,0);return r===e.value.length||rt(e.value,r)?at(n,e.value,r)?0:1:0})),integer:ot((function(e,t,n){if(null===e||e.type!==Xe.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ge(e.value.charCodeAt(r)))return 0;return at(n,e.value,r)?0:1})),"-ms-legacy-expression":function(e,t){return null!==e&&tt(e.value,"expression(")?it(e,t):0}},ht=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},dt=function(e){this.str=e,this.pos=0};dt.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new ht(e,this.str,this.pos)}};var pt=dt,mt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return/[a-zA-Z0-9\-]/.test(e)})),ft={" ":1,"&&":2,"||":3,"|":4};function gt(e){return e.substringToPos(e.findWsEnd(e.pos))}function bt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===mt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function yt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function vt(e){var t=e.str.indexOf("'",e.pos+1);return-1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function kt(e){var t,n=null;return e.eat(123),t=yt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=yt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function wt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?kt(e):{min:1,max:0};break;case 123:t=kt(e);break;default:return null}return{type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function xt(e){var t=e.peek();return""===t?null:{type:"Token",value:t}}function St(e,t){function n(e,t){return{type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return ft[e]-ft[t]}));t.length>0;){for(var r=t.shift(),a=0,i=0;a<e.length;a++){var o=e[a];"Combinator"===o.type&&(o.value===r?(-1===i&&(i=a-1),e.splice(a,1),a--):(-1!==i&&a-i>1&&(e.splice(i,a-i,n(e.slice(i,a),r)),a=i+1),i=-1))}-1!==i&&t.length&&e.splice(i,a-i,n(e.slice(i,a),r))}return r}function Ct(e){for(var t,n=[],r={},a=null,i=e.pos;t=At(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==a&&"Combinator"!==a.type||(e.pos=i,e.error("Unexpected combinator")),r[t.value]=!0):null!==a&&"Combinator"!==a.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),a=t,i=e.pos);return null!==a&&"Combinator"===a.type&&(e.pos-=i,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:St(n,r)||" ",disallowEmpty:!1,explicit:!1}}function At(e){var t=e.charCode();if(t<128&&1===mt[t])return function(e){var t;return t=bt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):wt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return wt(e,function(e){var t;return e.eat(91),t=Ct(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=bt(e),e.eat(39),e.eat(62),wt(e,{type:"Property",name:t})}(e):function(e){var t,n=null;return e.eat(60),t=bt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(gt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(yt(e)),gt(e),e.eat(44),gt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(yt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),wt(e,{type:"Type",name:t,opts:n})}(e);case 124:return{type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return wt(e,{type:"String",value:vt(e)});case 32:case 9:case 10:case 13:case 12:return{type:"Spaces",value:gt(e)};case 64:return(t=e.nextCharCode())<128&&1===mt[t]?(e.pos++,{type:"AtKeyword",name:bt(e)}):xt(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return xt(e);break;default:return xt(e)}}function zt(e){var t=new pt(e),n=Ct(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}zt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Pt=zt,Lt=function(){};function Tt(e){return"function"==typeof e?e:Lt}var Et=function(e,t,n){var r=Lt,a=Lt;if("function"==typeof t?r=t:t&&(r=Tt(t.enter),a=Tt(t.leave)),r===Lt&&a===Lt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}a.call(n,t)}(e)},Ot=new H,Dt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],a="";return{children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r},chunk:function(e){a+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length},result:function(){return It(a,r)}}}};function It(e,t){var n=[],r=0,a=0,i=t?t[a].node:null;for(we(e,Ot);!Ot.eof;){if(t)for(;a<t.length&&r+t[a].len<=Ot.tokenStart;)r+=t[a++].len,i=t[a].node;n.push({type:Ot.tokenType,value:Ot.getTokenValue(),index:Ot.tokenIndex,balance:Ot.balance[Ot.tokenIndex],node:i}),Ot.next()}return n}var Rt={type:"Match"},Nt={type:"Mismatch"},Bt={type:"DisallowEmpty"};function Mt(e,t,n){return t===Rt&&n===Nt||e===Rt&&t===Rt&&n===Rt?e:("If"===e.type&&e.else===Nt&&t===Rt&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function jt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function _t(e){return"Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&jt(e.name)}function qt(e){if("function"==typeof e)return{type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var a=Rt,i=n.length-1;i>=0;i--)a=Mt(l=n[i],a,Nt);return a;case"|":a=Nt;var o=null;for(i=n.length-1;i>=0;i--){if(_t(l=n[i])&&(null===o&&i>0&&_t(n[i-1])&&(a=Mt({type:"Enum",map:o=Object.create(null)},Rt,a)),null!==o)){var s=(jt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==0){o[s]=l;continue}}o=null,a=Mt(l,Rt,a)}return a;case"&&":if(n.length>5)return{type:"MatchOnce",terms:n,all:!0};for(a=Nt,i=n.length-1;i>=0;i--){var l=n[i];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):Rt,a=Mt(l,c,a)}return a;case"||":if(n.length>5)return{type:"MatchOnce",terms:n,all:!1};for(a=r?Rt:Nt,i=n.length-1;i>=0;i--){var c;l=n[i],c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):Rt,a=Mt(l,c,a)}return a}}(e.combinator,e.terms.map(qt),!1);return e.disallowEmpty&&(t=Mt(t,Bt,Nt)),t;case"Multiplier":return function(e){var t=Rt,n=qt(e.term);if(0===e.max)n=Mt(n,Bt,Nt),(t=Mt(n,null,Nt)).then=Mt(Rt,Rt,t),e.comma&&(t.then.else=Mt({type:"Comma",syntax:e},t,Nt));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==Rt&&(t=Mt({type:"Comma",syntax:e},t,Nt)),t=Mt(n,Mt(Rt,Rt,t),Nt);if(0===e.min)t=Mt(Rt,Rt,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==Rt&&(t=Mt({type:"Comma",syntax:e},t,Nt)),t=Mt(n,t,Nt);return t}(e);case"Type":case"Property":return{type:e.type,name:e.name,syntax:e};case"Keyword":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return{type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return{type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return{type:e.type,value:e.value,syntax:e};case"Comma":return{type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Wt=Rt,Ft=Nt,Ut=Bt,Yt=Object.prototype.hasOwnProperty,Ht=Wt,Vt=Ft,Kt=Ut,Gt=h.TYPE;function $t(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return!1}return!0}function Qt(e){return null===e||e.type===Gt.Comma||e.type===Gt.Function||e.type===Gt.LeftParenthesis||e.type===Gt.LeftSquareBracket||e.type===Gt.LeftCurlyBracket||function(e){return e.type===Gt.Delim&&"?"!==e.value}(e)}function Xt(e){return null===e||e.type===Gt.RightParenthesis||e.type===Gt.RightSquareBracket||e.type===Gt.RightCurlyBracket||e.type===Gt.Delim}function Zt(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(a){if(Array.isArray(a.match)){for(var i=0;i<a.match.length;i++)if(r(a.match[i]))return t(a.syntax)&&n.unshift(a.syntax),!0}else if(a.node===e)return n=t(a.syntax)?[a.syntax]:[],!0;return!1}(this.matched),n}function Jt(e,t,n){var r=Zt.call(e,t);return null!==r&&r.some(n)}var en={getTrace:Zt,isType:function(e,t){return Jt(this,e,(function(e){return"Type"===e.type&&e.name===t}))},isProperty:function(e,t){return Jt(this,e,(function(e){return"Property"===e.type&&e.name===t}))},isKeyword:function(e){return Jt(this,e,(function(e){return"Keyword"===e.type}))}},tn=function(e,t,n,r,a){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===a){var l=function e(t){return"node"in t?t.node:e(t.match[0])}(s),c=function e(t){return"node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new i;do{if(r.appendData(t.data),t.data===c)break;t=t.next}while(null!==t);o.push({parent:n,nodes:r})}}))}Array.isArray(s.match)&&s.match.forEach(n)}(n.matched),o},nn=Object.prototype.hasOwnProperty;function rn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function an(e){return Boolean(e)&&rn(e.offset)&&rn(e.line)&&rn(e.column)}function on(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var a in n){var o=!0;if(!1!==nn.call(n,a)){if("type"===a)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===a){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)a+=".source";else if(an(n.loc.start)){if(an(n.loc.end))continue;a+=".end"}else a+=".start";o=!1}else if(t.hasOwnProperty(a)){var s=0;for(o=!1;!o&&s<t[a].length;s++){var l=t[a][s];switch(l){case String:o="string"==typeof n[a];break;case Boolean:o="boolean"==typeof n[a];break;case null:o=null===n[a];break;default:"string"==typeof l?o=n[a]&&n[a].type===l:Array.isArray(l)&&(o=n[a]instanceof i)}}}else r(n,"Unknown field `"+a+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+a+"`")}}for(var a in t)nn.call(t,a)&&!1===nn.call(n,a)&&r(n,"Field `"+e+"."+a+"` is missed")}}function sn(e,t){var n=t.structure,r={type:String,loc:!0},a={type:'"'+e+'"'};for(var i in n)if(!1!==nn.call(n,i)){for(var o=[],s=r[i]=Array.isArray(n[i])?n[i].slice():[n[i]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else{if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+i+"` structure definition");o.push("List")}}a[i]=o.join(" | ")}return{docs:a,check:on(e,r)}}var ln=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},cn=function(e,t,n,r){const a=o("SyntaxMatchError",e),{css:i,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,a=r<n.length&&n[r].node||null,i=a!==t?a:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==i&&n[e].node===i&&(e<=r?u++:u=0),h+=t}return r===n.length||u>1?(o=$(i||t,"end")||Q(G,h),s=Q(o)):(o=$(i,"start")||Q($(t,"start")||G,h.slice(0,l)),s=$(i,"end")||Q(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return a.rawMessage=e,a.syntax=t?K(t):"<generic>",a.css=i,a.mismatchOffset=s,a.mismatchLength=l,a.message=e+"\n syntax: "+a.syntax+"\n value: "+(i||"<empty string>")+"\n --------"+new Array(a.mismatchOffset+1).join("-")+"^",Object.assign(a,c),a.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},a},un=function(e,t){return"string"==typeof e&&(e=Pt(e)),{type:"MatchGraph",match:qt(e),syntax:t||null,source:e}},hn=function(e,t,n){var r=function(e,t,n){function r(){do{b++,g=b<e.length?e[b]:null}while(null!==g&&(g.type===Gt.WhiteSpace||g.type===Gt.Comment))}function a(t){var n=b+t;return n<e.length?e[n]:null}function i(e,t){return{nextState:e,matchStack:v,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:v,syntaxStack:u,prev:h}}function s(e){d=i(e,d)}function l(){v={type:1,syntax:t.syntax,token:g,prev:v},r(),p=null,b>y&&(y=b)}function c(){v=2===v.type?v.prev:{type:3,syntax:u.syntax,token:v.token,prev:v},u=u.prev}var u=null,h=null,d=null,p=null,m=0,f=null,g=null,b=-1,y=0,v={type:0,syntax:null,token:null,prev:null};for(r();null===f&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==g&&(b!==e.length-1||"\\0"!==g.value&&"\\9"!==g.value)){t=Vt;break}f="Match";break}if((t=h.nextState)===Kt){if(h.matchStack===v){t=Vt;break}t=Ht}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==p&&!1!==p)(null===d||b>d.tokenIndex)&&(d=p,p=!1);else if(null===d){f="Mismatch";break}t=d.nextState,h=d.thenStack,u=d.syntaxStack,v=d.matchStack,b=d.tokenIndex,g=b<e.length?e[b]:null,d=d.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==Vt&&s(t.else),t.then!==Ht&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var k=t.syntax.terms;if(t.index===k.length){if(0===t.mask||t.syntax.all){t=Vt;break}t=Ht;break}if(t.mask===(1<<k.length)-1){t=Ht;break}for(;t.index<k.length;t.index++){var w=1<<t.index;if(0==(t.mask&w)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|w}),t=k[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==g&&(-1!==(z=g.value.toLowerCase()).indexOf("\\")&&(z=z.replace(/\\[09].*$/,"")),Yt.call(t.map,z))){t=t.map[z];break}t=Vt;break;case"Generic":var x=null!==u?u.opts:null,S=b+Math.floor(t.fn(g,a,x));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Ht}else t=Vt;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",A=Yt.call(n,C)?n[C][t.name]:null;if(!A||!A.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==p&&null!==g&&"Type"===t.type&&("custom-ident"===t.name&&g.type===Gt.Ident||"length"===t.name&&"0"===g.value)){null===p&&(p=i(t,d)),t=Vt;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},v={type:2,syntax:t.syntax,token:v.token,prev:v},t=A.match;break;case"Keyword":var z=t.name;if(null!==g){var P=g.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),$t(P,z)){l(),t=Ht;break}}t=Vt;break;case"AtKeyword":case"Function":if(null!==g&&$t(g.value,t.name)){l(),t=Ht;break}t=Vt;break;case"Token":if(null!==g&&g.value===t.value){l(),t=Ht;break}t=Vt;break;case"Comma":null!==g&&g.type===Gt.Comma?Qt(v.token)?t=Vt:(l(),t=Xt(g)?Vt:Ht):t=Qt(v.token)||Xt(g)?Ht:Vt;break;case"String":var L="";for(S=b;S<e.length&&L.length<t.value.length;S++)L+=e[S].value;if($t(L,t.value)){for(;b<S;)l();t=Ht}else t=Vt;break;default:throw new Error("Unknown node type: "+t.type)}switch(f){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),f="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",v=null;break;case"Match":for(;null!==u;)c();break;default:v=null}return{tokens:e,reason:f,iterations:m,match:v,longestMatch:y}}(e,t,n||{});if(null===r.match)return r;var a=r.match,i=r.match={syntax:t.syntax||null,match:[]},o=[i];for(a=function(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}(a).prev;null!==a;){switch(a.type){case 2:i.match.push(i={syntax:a.syntax,match:[]}),o.push(i);break;case 3:o.pop(),i=o[o.length-1];break;default:i.match.push({syntax:a.syntax||null,token:a.token.value,node:a.token.node})}a=a.prev}return r},dn=un("inherit | initial | unset"),pn=un("inherit | initial | unset | <-ms-legacy-expression>");function mn(e,t,n){var r={};for(var a in e)e[a].syntax&&(r[a]=n?e[a].syntax:K(e[a].syntax,{compact:t}));return r}function fn(e,t,n){const r={};for(const[a,i]of Object.entries(e))r[a]={prelude:i.prelude&&(n?i.prelude.syntax:K(i.prelude.syntax,{compact:t})),descriptors:i.descriptors&&mn(i.descriptors,t,n)};return r}function gn(e,t,n){return{matched:e,iterations:n,error:t,getTrace:en.getTrace,isType:en.isType,isProperty:en.isProperty,isKeyword:en.isKeyword}}function bn(e,t,n,r){var a,i=function(e,t){return"string"==typeof e?It(e,null):t.generate(e,Dt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return!0;return!1}(i)?gn(null,new Error("Matching for a tree with var() is not supported")):(r&&(a=hn(i,e.valueCommonSyntax,e)),r&&a.match||(a=hn(i,t.match,e)).match?gn(a.match,null,a.iterations):gn(null,new cn(a.reason,t.syntax,n,a),a.iterations))}var yn=function(e,t,n){if(this.valueCommonSyntax=dn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||function(e){var t={};if(e.node)for(var n in e.node)if(nn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=sn(n,r)}return t}(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,ut)this.addType_(r,ut[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r])}};yn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t})}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`")})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var a={type:t,name:n},i={type:t,name:n,parent:r,syntax:null,match:null};return"function"==typeof e?i.match=un(e,a):("string"==typeof e?Object.defineProperty(i,"syntax",{get:function(){return Object.defineProperty(i,"syntax",{value:Pt(e)}),i.syntax}}):i.syntax=e,Object.defineProperty(i,"match",{get:function(){return Object.defineProperty(i,"match",{value:un(i.syntax,a)}),i.match}})),i},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null})},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e))},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===ut["-ms-legacy-expression"]&&(this.valueCommonSyntax=pn))},checkAtruleName:function(e){if(!this.getAtrule(e))return new ln("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return!r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),a=ne.keyword(t);return r.descriptors?r.descriptors[a.name]||r.descriptors[a.basename]?void 0:new ln("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ne.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new ln("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?gn(null,n):t?bn(this,this.getAtrule(e).prelude,t,!0):gn(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return gn(null,r);var a=this.getAtrule(e),i=ne.keyword(t);return bn(this,a.descriptors[i.name]||a.descriptors[i.basename],n,!0)},matchDeclaration:function(e){return"Declaration"!==e.type?gn(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?gn(null,n):bn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?bn(this,n,t,!1):gn(null,new ln("Unknown type",e))},match:function(e,t){return"string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),bn(this,e,t,!1)):gn(null,new ln("Bad syntax"))},findValueFragments:function(e,t,n,r){return tn(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return tn(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n))}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ne.keyword(e);return(n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ne.property(e);return(n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,a,i,o){if(i.hasOwnProperty(a))return i[a];i[a]=!1,null!==o.syntax&&Et(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(i[a]=!0)}}),this)}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return{generic:this.generic,types:mn(this.types,!t,e),properties:mn(this.properties,!t,e),atrules:fn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var vn=yn,kn={SyntaxError:ht,parse:Pt,generate:K,walk:Et},wn=we.isBOM,xn=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1};xn.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(function(e,t){for(var n=t.length,r=ae(e.lines,n),a=e.startLine,i=ae(e.columns,n),o=e.startColumn,s=t.length>0?wn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=a,i[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=a,i[s]=o),a++,o=1)}r[s]=a,i[s]=o,e.lines=r,e.columns=i}(this,this.source),this.linesAndColumnsComputed=!0)},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Sn=xn,Cn=we.TYPE,An=Cn.WhiteSpace,zn=Cn.Comment,Pn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case zn:this.scanner.next();continue;case An:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1}return t},{findWhiteSpaceStart:Ln,cmpStr:Tn}=M,En=function(){},On=h.TYPE,Dn=h.NAME,In=On.WhiteSpace,Rn=On.Comment,Nn=On.Ident,Bn=On.Function,Mn=On.Url,jn=On.Hash,_n=On.Percentage,qn=On.Number;function Wn(e){return function(){return this[e]()}}var Fn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),Un=function(e){if(0<=e&&e<Fn.length)return Fn[e];throw new TypeError("Must be between 0 and 63: "+e)},Yn=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=Un(t)}while(r>0);return n},Hn=function(e,t){return function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function a(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function i(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=a(e);if(r){if(!r.path)return e;n=r.path}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,i(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=a(t),s=a(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),i(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,i(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,i(s)):l}t.urlParse=a,t.urlGenerate=i,t.normalize=o,t.join=s,t.isAbsolute=function(e){return"/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!=(r=e.originalLine-t.originalLine)||0!=(r=e.originalColumn-t.originalColumn)||n||0!=(r=e.generatedColumn-t.generatedColumn)||0!=(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!=(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!=(r=e.originalLine-t.originalLine)||0!=(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!=(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!=(n=e.originalLine-t.originalLine)||0!=(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=a(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1))}t=s(i(r),t)}return o(t)}}(t={exports:{}},t.exports),t.exports}(),Vn=(Hn.getArg,Hn.urlParse,Hn.urlGenerate,Hn.normalize,Hn.join,Hn.isAbsolute,Hn.relative,Hn.toSetString,Hn.fromSetString,Hn.compareByOriginalPositions,Hn.compareByGeneratedPositionsDeflated,Hn.compareByGeneratedPositionsInflated,Hn.parseSourceMapInput,Hn.computeSourceURL,Object.prototype.hasOwnProperty),Kn="undefined"!=typeof Map;function Gn(){this._array=[],this._set=Kn?new Map:Object.create(null)}Gn.fromArray=function(e,t){for(var n=new Gn,r=0,a=e.length;r<a;r++)n.add(e[r],t);return n},Gn.prototype.size=function(){return Kn?this._set.size:Object.getOwnPropertyNames(this._set).length},Gn.prototype.add=function(e,t){var n=Kn?e:Hn.toSetString(e),r=Kn?this.has(e):Vn.call(this._set,n),a=this._array.length;r&&!t||this._array.push(e),r||(Kn?this._set.set(e,a):this._set[n]=a)},Gn.prototype.has=function(e){if(Kn)return this._set.has(e);var t=Hn.toSetString(e);return Vn.call(this._set,t)},Gn.prototype.indexOf=function(e){if(Kn){var t=this._set.get(e);if(t>=0)return t}else{var n=Hn.toSetString(e);if(Vn.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},Gn.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},Gn.prototype.toArray=function(){return this._array.slice()};var $n=Gn;function Qn(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}Qn.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},Qn.prototype.add=function(e){var t,n,r,a,i,o;n=e,r=(t=this._last).generatedLine,a=n.generatedLine,i=t.generatedColumn,o=n.generatedColumn,a>r||a==r&&o>=i||Hn.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},Qn.prototype.toArray=function(){return this._sorted||(this._array.sort(Hn.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var Xn=$n,Zn={MappingList:Qn}.MappingList;function Jn(e){e||(e={}),this._file=Hn.getArg(e,"file",null),this._sourceRoot=Hn.getArg(e,"sourceRoot",null),this._skipValidation=Hn.getArg(e,"skipValidation",!1),this._sources=new Xn,this._names=new Xn,this._mappings=new Zn,this._sourcesContents=null}Jn.prototype._version=3,Jn.fromSourceMap=function(e){var t=e.sourceRoot,n=new Jn({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=Hn.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(r){var a=r;null!==t&&(a=Hn.relative(t,r)),n._sources.has(a)||n._sources.add(a);var i=e.sourceContentFor(r);null!=i&&n.setSourceContent(r,i)})),n},Jn.prototype.addMapping=function(e){var t=Hn.getArg(e,"generated"),n=Hn.getArg(e,"original",null),r=Hn.getArg(e,"source",null),a=Hn.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,a),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=a&&(a=String(a),this._names.has(a)||this._names.add(a)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:a})},Jn.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=Hn.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[Hn.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[Hn.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},Jn.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var a=this._sourceRoot;null!=a&&(r=Hn.relative(a,r));var i=new Xn,o=new Xn;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=Hn.join(n,t.source)),null!=a&&(t.source=Hn.relative(a,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name))}var l=t.source;null==l||i.has(l)||i.add(l);var c=t.name;null==c||o.has(c)||o.add(c)}),this),this._sources=i,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=Hn.join(n,t)),null!=a&&(t=Hn.relative(a,t)),this.setSourceContent(t,r))}),this)},Jn.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},Jn.prototype._serializeMappings=function(){for(var e,t,n,r,a=0,i=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),d=0,p=h.length;d<p;d++){if(e="",(t=h[d]).generatedLine!==i)for(a=0;t.generatedLine!==i;)e+=";",i++;else if(d>0){if(!Hn.compareByGeneratedPositionsInflated(t,h[d-1]))continue;e+=","}e+=Yn(t.generatedColumn-a),a=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=Yn(r-c),c=r,e+=Yn(t.originalLine-1-s),s=t.originalLine-1,e+=Yn(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=Yn(n-l),l=n)),u+=e}return u},Jn.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=Hn.relative(t,e));var n=Hn.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},Jn.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},Jn.prototype.toString=function(){return JSON.stringify(this.toJSON())};var er={SourceMapGenerator:Jn}.SourceMapGenerator,tr={Atrule:!0,Selector:!0,Declaration:!0},nr=Object.prototype.hasOwnProperty;function rr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e}),this)}var ar=Object.prototype.hasOwnProperty,ir=function(){};function or(e){return"function"==typeof e?e:ir}function sr(e,t){return function(n,r,a){n.type===t&&e.call(this,n,r,a)}}function lr(e,t){var n=t.structure,r=[];for(var a in n)if(!1!==ar.call(n,a)){var i=n[a],o={name:a,type:!1,nullable:!1};Array.isArray(n[a])||(i=[n[a]]);for(var s=0;s<i.length;s++){var l=i[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list")}o.type&&r.push(o)}return r.length?{context:t.walkContext,fields:r}:null}function cr(e,t){var n=e.fields.slice(),r=e.context,a="string"==typeof r;return t&&n.reverse(),function(e,i,o,s){var l;a&&(l=i[r],i[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return!0}else if(o(h))return!0}a&&(i[r]=l)}}function ur(e){return{Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var hr=function e(t){var n={};for(var r in t){var a=t[r];a&&(Array.isArray(a)||a instanceof i?a=a.map(e):a.constructor===Object&&(a=e(a))),n[r]=a}return n};const dr=Object.prototype.hasOwnProperty,pr={generic:!0,types:br,atrules:{prelude:yr,descriptors:yr},properties:br,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)dr.call(n,r)&&(mr(t[r])?e(t[r],fr(n[r])):t[r]=fr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function mr(e){return e&&e.constructor===Object}function fr(e){return mr(e)?Object.assign({},e):e}function gr(e,t){return"string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function br(e,t){if("string"==typeof t)return gr(e,t);const n=Object.assign({},e);for(let r in t)dr.call(t,r)&&(n[r]=gr(dr.call(e,r)?e[r]:void 0,t[r]));return n}function yr(e,t){const n=br(e,t);return!mr(n)||Object.keys(n).length?n:null}var vr=(e,t)=>function e(t,n,r){for(const a in r)if(!1!==dr.call(r,a))if(!0===r[a])a in n&&dr.call(n,a)&&(t[a]=fr(n[a]));else if(r[a])if("function"==typeof r[a]){const e=r[a];t[a]=e({},t[a]),t[a]=e(t[a]||{},n[a])}else if(mr(r[a])){const i={};for(let n in t[a])i[n]=e({},t[a][n],r[a]);for(let t in n[a])i[t]=e(i[t]||{},n[a][t],r[a]);t[a]=i}else if(Array.isArray(r[a])){const i={},o=r[a].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[a]||{}))i[n]={},r&&e(i[n],r,o);for(const t in n[a])dr.call(n[a],t)&&(i[t]||(i[t]={}),n[a]&&n[a][t]&&e(i[t],n[a][t],o));t[a]=i}return t}(e,t,pr);function kr(e){var t=function(e){var t={scanner:new H,locationMap:new Sn,filename:"<unknown>",needPositions:!1,onParseError:En,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Pn,createList:function(){return new i},createSingleNodeList:function(e){return(new i).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==In)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=Dn[e]+" is expected";switch(e){case Nn:this.scanner.tokenType===Bn||this.scanner.tokenType===Mn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case jn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case _n:this.scanner.tokenType===qn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1)}this.error(n,t)}this.scanner.next()},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Bn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(Ln(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Wn(e.parseContext[n])}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse)}if(e.pseudo)for(var n in e.pseudo){var a=e.pseudo[n];a.parse&&(t.pseudo[n]=a.parse)}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,a=(n=n||{}).context||"default",i=n.onComment;if(we(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:En,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(a))throw new Error("Unknown context `"+a+"`");return"function"==typeof i&&t.scanner.forEachToken((n,r,a)=>{if(n===Rn){const n=t.getLocation(r,a),o=Tn(e,a-2,a,"*/")?e.slice(r+2,a-2):e.slice(r+2,a);i(o,n)}}),r=t.context[a].call(t,n),t.scanner.eof||t.error(),r}}(e),n=function(e){var t=function(e){var t={};for(var n in e.node)if(ar.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=lr(0,r)}return t}(e),n={},r={},a=Symbol("break-walk"),i=Symbol("skip-node");for(var o in t)ar.call(t,o)&&null!==t[o]&&(n[o]=cr(t[o],!1),r[o]=cr(t[o],!0));var s=ur(n),l=ur(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===a||r!==i&&(!(!p.hasOwnProperty(e.type)||!p[e.type](e,m,c,u))||d.call(m,e,t,n)===a)}var u=(e,t,n,r)=>e||c(t,n,r),h=ir,d=ir,p=n,m={break:a,skip:i,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=or(o.enter),d=or(o.leave),o.reverse&&(p=r),o.visit)){if(s.hasOwnProperty(o.visit))p=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=sr(h,o.visit),d=sr(d,o.visit)}if(h===ir&&d===ir)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e)};return c.break=a,c.skip=i,c.find=function(e,t){var n=null;return c(e,(function(e,r,i){if(t.call(this,e,r,i))return n=e,a})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,i){if(t.call(this,e,r,i))return n=e,a}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,a){t.call(this,e,r,a)&&n.push(e)})),n},c}(e),r=function(e){function t(e){if(!nr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e)}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",a={children:rr,node:t,chunk:function(e){r+=e},result:function(){return r}};return n&&("function"==typeof n.decorator&&(a=n.decorator(a)),n.sourceMap&&(a=function(e){var t=new er,n=1,r=0,a={line:1,column:0},i={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&tr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;i.line===u&&i.column===h||(i.line=u,i.column=h,a.line=n,a.column=r,o&&(o=!1,a.line===s.line&&a.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:i,generated:a}))}c.call(this,e),o&&tr.hasOwnProperty(e.type)&&(s.line=n,s.column=r)};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e)};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(a))),a.node(e),a.result()}}(e),a=function(e){return{fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof i==0&&(e.children=(new i).fromArray(e.children))}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof i&&(e.children=e.children.toArray())}}),t}}}(n),o={List:i,SyntaxError:l,TokenStream:H,Lexer:vn,vendorPrefix:ne.vendorPrefix,keyword:ne.keyword,property:ne.property,isCustomProperty:ne.isCustomProperty,definitionSyntax:kn,lexer:null,createLexer:function(e){return new vn(e,o,o.lexer.structure)},tokenize:we,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:hr,fromPlainObject:a.fromPlainObject,toPlainObject:a.toPlainObject,createSyntax:function(e){return kr(vr({},e))},fork:function(t){var n=vr({},e);return kr("function"==typeof t?t(n,Object.assign):vr(n,t))}};return o.lexer=new vn({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var wr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},xr=we.cmpChar,Sr=we.isDigit,Cr=we.TYPE,Ar=Cr.WhiteSpace,zr=Cr.Comment,Pr=Cr.Ident,Lr=Cr.Number,Tr=Cr.Dimension;function Er(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Sr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n)}function Or(e){return Er.call(this,0,e)}function Dr(e,t){if(!xr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected"}this.error(n,this.scanner.tokenStart+e)}}function Ir(){for(var e=0,t=0,n=this.scanner.tokenType;n===Ar||n===zr;)n=this.scanner.lookupType(++e);if(n!==Lr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e)}while(n===Ar||n===zr);n!==Lr&&(this.scanner.skip(e),Or.call(this,!0))}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Or.call(this,0!==t),45===t?"-"+this.consume(Lr):this.consume(Lr)}var Rr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===Lr)Or.call(this,!1),n=this.consume(Lr);else if(this.scanner.tokenType===Pr&&xr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Dr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Ir.call(this);break;case 3:Dr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr);break;default:Dr.call(this,2,45),Er.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2)}else if(this.scanner.tokenType===Pr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Pr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Dr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Ir.call(this);break;case 2:Dr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr);break;default:Dr.call(this,1,45),Er.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1)}}else if(this.scanner.tokenType===Tr){for(var a=this.scanner.source.charCodeAt(this.scanner.tokenStart),i=(r=43===a||45===a,this.scanner.tokenStart+r);i<this.scanner.tokenEnd&&Sr(this.scanner.source.charCodeAt(i));i++);i===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Dr.call(this,i-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,i),i+1===this.scanner.tokenEnd?(this.scanner.next(),n=Ir.call(this)):(Dr.call(this,i-this.scanner.tokenStart+1,45),i+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Or.call(this,!0),n="-"+this.consume(Lr)):(Er.call(this,i-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(i+1)))}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b))}},Nr=we.TYPE,Br=Nr.WhiteSpace,Mr=Nr.Semicolon,jr=Nr.LeftCurlyBracket,_r=Nr.Delim;function qr(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Br?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function Wr(){return 0}var Fr={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,a=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||Wr)),r=n&&this.scanner.tokenStart>a?qr.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(a,r),value:this.scanner.source.substring(a,r)}},generate:function(e){this.chunk(e.value)},mode:{default:Wr,leftCurlyBracket:function(e){return e===jr?1:0},leftCurlyBracketOrSemicolon:function(e){return e===jr||e===Mr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===_r&&33===t.charCodeAt(n)||e===Mr?1:0},semicolonIncluded:function(e){return e===Mr?2:0}}},Ur=we.TYPE,Yr=Fr.mode,Hr=Ur.AtKeyword,Vr=Ur.Semicolon,Kr=Ur.LeftCurlyBracket,Gr=Ur.RightCurlyBracket;function $r(e){return this.Raw(e,Yr.leftCurlyBracketOrSemicolon,!0)}function Qr(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===Gr)return!0;if(e===Kr||e===Hr)return!1}return!1}var Xr={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,a=null;switch(this.eat(Hr),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==Kr&&this.scanner.tokenType!==Vr&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),$r)).type&&null===r.children.head&&(r=null):r=$r.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case Vr:this.scanner.next();break;case Kr:a=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(Qr.call(this))}return{type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:a}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";")},walkContext:"atrule"},Zr=we.TYPE,Jr=Zr.Semicolon,ea=Zr.LeftCurlyBracket,ta={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==ea&&this.scanner.tokenType!==Jr&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e)},walkContext:"atrulePrelude"},na=we.TYPE,ra=na.Ident,aa=na.String,ia=na.Colon,oa=na.LeftSquareBracket,sa=na.RightSquareBracket;function la(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(ra),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(ra)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ia&&(this.scanner.next(),this.eat(ra)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function ca(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var ua={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,a=null;return this.eat(oa),this.scanner.skipSC(),e=la.call(this),this.scanner.skipSC(),this.scanner.tokenType!==sa&&(this.scanner.tokenType!==ra&&(n=ca.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===aa?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===ra&&(a=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(sa),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:a}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]")}},ha=we.TYPE,da=Fr.mode,pa=ha.WhiteSpace,ma=ha.Comment,fa=ha.Semicolon,ga=ha.AtKeyword,ba=ha.LeftCurlyBracket,ya=ha.RightCurlyBracket;function va(e){return this.Raw(e,null,!0)}function ka(){return this.parseWithFallback(this.Rule,va)}function wa(e){return this.Raw(e,da.semicolonIncluded,!0)}function xa(){if(this.scanner.tokenType===fa)return wa.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,wa);return this.scanner.tokenType===fa&&this.scanner.next(),e}var Sa={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?xa:ka,n=this.scanner.tokenStart,r=this.createList();this.eat(ba);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case ya:break e;case pa:case ma:this.scanner.next();break;case ga:r.push(this.parseWithFallback(this.Atrule,va));break;default:r.push(t.call(this))}return this.scanner.eof||this.eat(ya),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")})),this.chunk("}")},walkContext:"block"},Ca=we.TYPE,Aa=Ca.LeftSquareBracket,za=Ca.RightSquareBracket,Pa={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(Aa),n=e.call(this,t),this.scanner.eof||this.eat(za),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]")}},La=we.TYPE.CDC,Ta={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e")}},Ea=we.TYPE.CDO,Oa={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ea),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--")}},Da=we.TYPE.Ident,Ia={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Da)}},generate:function(e){this.chunk("."),this.chunk(e.name)}},Ra=we.TYPE.Ident,Na={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Ra&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected")}return{type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Ba=we.TYPE.Comment,Ma={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Ba),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/")}},ja=ne.isCustomProperty,_a=we.TYPE,qa=Fr.mode,Wa=_a.Ident,Fa=_a.Hash,Ua=_a.Colon,Ya=_a.Semicolon,Ha=_a.Delim,Va=_a.WhiteSpace;function Ka(e){return this.Raw(e,qa.exclamationMarkOrSemicolon,!0)}function Ga(e){return this.Raw(e,qa.exclamationMarkOrSemicolon,!1)}function $a(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==Ya&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var Qa={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=Xa.call(this),a=ja(r),i=a?this.parseCustomProperty:this.parseValue,o=a?Ga:Ka,s=!1;this.scanner.skipSC(),this.eat(Ua);const l=this.scanner.tokenIndex;if(a||this.scanner.skipSC(),e=i?this.parseWithFallback($a,o):o.call(this,this.scanner.tokenIndex),a&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===Va){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=Za.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==Ya&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"};function Xa(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===Ha)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.scanner.tokenType===Fa?this.eat(Fa):this.eat(Wa),this.scanner.substrToCursor(e)}function Za(){this.eat(Ha),this.scanner.skipSC();var e=this.consume(Wa);return"important"===e||e}var Ja=we.TYPE,ei=Fr.mode,ti=Ja.WhiteSpace,ni=Ja.Comment,ri=Ja.Semicolon;function ai(e){return this.Raw(e,ei.semicolonIncluded,!0)}var ii={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ti:case ni:case ri:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ai))}return{type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")}))}},oi=M.consumeNumber,si=we.TYPE.Dimension,li={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=oi(this.scanner.source,e);return this.eat(si),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit)}},ci=we.TYPE.RightParenthesis,ui={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,a=this.consumeFunctionName(),i=a.toLowerCase();return n=t.hasOwnProperty(i)?t[i].call(this,t):e.call(this,t),this.scanner.eof||this.eat(ci),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:a,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")")},walkContext:"function"},hi=we.TYPE.Hash,di={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(hi),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value)}},pi=we.TYPE.Ident,mi={name:"Identifier",structure:{name:String},parse:function(){return{type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(pi)}},generate:function(e){this.chunk(e.name)}},fi=we.TYPE.Hash,gi={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(fi),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name)}},bi=we.TYPE,yi=bi.Ident,vi=bi.Number,ki=bi.Dimension,wi=bi.LeftParenthesis,xi=bi.RightParenthesis,Si=bi.Colon,Ci=bi.Delim,Ai={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(wi),this.scanner.skipSC(),e=this.consume(yi),this.scanner.skipSC(),this.scanner.tokenType!==xi){switch(this.eat(Si),this.scanner.skipSC(),this.scanner.tokenType){case vi:n=this.lookupNonWSType(1)===Ci?this.Ratio():this.Number();break;case ki:n=this.Dimension();break;case yi:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected")}this.scanner.skipSC()}return this.eat(xi),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")")}},zi=we.TYPE,Pi=zi.WhiteSpace,Li=zi.Comment,Ti=zi.Ident,Ei=zi.LeftParenthesis,Oi={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Li:this.scanner.next();continue;case Pi:n=this.WhiteSpace();continue;case Ti:t=this.Identifier();break;case Ei:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t)}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},Di=we.TYPE.Comma,Ii={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Di);)this.scanner.next();return{type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",")}))}},Ri=we.TYPE.Number,Ni={name:"Number",structure:{value:String},parse:function(){return{type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ri)}},generate:function(e){this.chunk(e.value)}},Bi={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Mi=we.TYPE,ji=Mi.LeftParenthesis,_i=Mi.RightParenthesis,qi={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(ji),n=e.call(this,t),this.scanner.eof||this.eat(_i),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")")}},Wi=M.consumeNumber,Fi=we.TYPE.Percentage,Ui={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=Wi(this.scanner.source,e);return this.eat(Fi),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%")}},Yi=we.TYPE,Hi=Yi.Ident,Vi=Yi.Function,Ki=Yi.Colon,Gi=Yi.RightParenthesis,$i={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(Ki),this.scanner.tokenType===Vi?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(Gi)):e=this.consume(Hi),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},Qi=we.TYPE,Xi=Qi.Ident,Zi=Qi.Function,Ji=Qi.Colon,eo=Qi.RightParenthesis,to={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(Ji),this.eat(Ji),this.scanner.tokenType===Zi?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(eo)):e=this.consume(Xi),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},no=we.isDigit,ro=we.TYPE,ao=ro.Number,io=ro.Delim;function oo(){this.scanner.skipWS();for(var e=this.consume(ao),t=0;t<e.length;t++){var n=e.charCodeAt(t);no(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t)}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var so={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=oo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(io),e=oo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right)}},lo=we.TYPE,co=Fr.mode,uo=lo.LeftCurlyBracket;function ho(e){return this.Raw(e,co.leftCurlyBracket,!0)}function po(){var e=this.SelectorList();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==uo&&this.error(),e}var mo={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(po,ho):ho.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block)},walkContext:"rule"},fo=we.TYPE.Comma,go={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===fo);)this.scanner.next();return{type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",")}))},walkContext:"selector"},bo=we.TYPE.String,yo={name:"String",structure:{value:String},parse:function(){return{type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(bo)}},generate:function(e){this.chunk(e.value)}},vo=we.TYPE,ko=vo.WhiteSpace,wo=vo.Comment,xo=vo.AtKeyword,So=vo.CDO,Co=vo.CDC;function Ao(e){return this.Raw(e,null,!1)}var zo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case ko:this.scanner.next();continue;case wo:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case So:e=this.CDO();break;case Co:e=this.CDC();break;case xo:e=this.parseWithFallback(this.Atrule,Ao);break;default:e=this.parseWithFallback(this.Rule,Ao)}n.push(e)}return{type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e)},walkContext:"stylesheet"},Po=we.TYPE.Ident;function Lo(){this.scanner.tokenType!==Po&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next()}var To={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),Lo.call(this)):(Lo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),Lo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Eo=we.isHexDigit,Oo=we.cmpChar,Do=we.TYPE,Io=we.NAME,Ro=Do.Ident,No=Do.Number,Bo=Do.Dimension;function Mo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var a=this.scanner.source.charCodeAt(n);if(45===a&&t&&0!==r)return 0===Mo.call(this,e+r+1,!1)&&this.error(),-1;Eo(a)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n)}return this.scanner.next(),r}function jo(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next()}function _o(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Io[e]+" is expected")}function qo(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Ro?void((e=Mo.call(this,0,!0))>0&&jo.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void jo.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===No?(_o.call(this,43),e=Mo.call(this,1,!0),this.scanner.isDelim(63)?void jo.call(this,6-e):this.scanner.tokenType===Bo||this.scanner.tokenType===No?(_o.call(this,45),void Mo.call(this,1,!1)):void 0):this.scanner.tokenType===Bo?(_o.call(this,43),void((e=Mo.call(this,1,!0))>0&&jo.call(this,6-e))):void this.error()}var Wo={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Oo(this.scanner.source,e,117)||this.error("U is expected"),Oo(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),qo.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Fo=we.isWhiteSpace,Uo=we.cmpStr,Yo=we.TYPE,Ho=Yo.Function,Vo=Yo.Url,Ko=Yo.RightParenthesis,Go={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case Vo:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&Fo(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&Fo(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(Vo);break;case Ho:Uo(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(Ho),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(Ko);break;default:this.error("Url or Function is expected")}return{type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")")}},$o=we.TYPE.WhiteSpace,Qo=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),Xo={AnPlusB:Rr,Atrule:Xr,AtrulePrelude:ta,AttributeSelector:ua,Block:Sa,Brackets:Pa,CDC:Ta,CDO:Oa,ClassSelector:Ia,Combinator:Na,Comment:Ma,Declaration:Qa,DeclarationList:ii,Dimension:li,Function:ui,Hash:di,Identifier:mi,IdSelector:gi,MediaFeature:Ai,MediaQuery:Oi,MediaQueryList:Ii,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,a=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),a=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(a.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:a}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector))}},Number:Ni,Operator:Bi,Parentheses:qi,Percentage:Ui,PseudoClassSelector:$i,PseudoElementSelector:to,Ratio:so,Raw:Fr,Rule:mo,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},SelectorList:go,String:yo,StyleSheet:zo,TypeSelector:To,UnicodeRange:Wo,Url:Go,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return{type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e)}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat($o),Qo},generate:function(e){this.chunk(e.value)}}},Zo={generic:!0,types:wr.types,atrules:wr.atrules,properties:wr.properties,node:Xo},Jo=we.cmpChar,es=we.cmpStr,ts=we.TYPE,ns=ts.Ident,rs=ts.String,as=ts.Number,is=ts.Function,os=ts.Url,ss=ts.Hash,ls=ts.Dimension,cs=ts.Percentage,us=ts.LeftParenthesis,hs=ts.LeftSquareBracket,ds=ts.Comma,ps=ts.Delim,ms=function(e){switch(this.scanner.tokenType){case ss:return this.Hash();case ds:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case us:return this.Parentheses(this.readSequence,e.recognizer);case hs:return this.Brackets(this.readSequence,e.recognizer);case rs:return this.String();case ls:return this.Dimension();case cs:return this.Percentage();case as:return this.Number();case is:return es(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case os:return this.Url();case ns:return Jo(this.scanner.source,this.scanner.tokenStart,117)&&Jo(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1)}},fs={getNode:ms},gs=we.TYPE,bs=gs.Delim,ys=gs.Ident,vs=gs.Dimension,ks=gs.Percentage,ws=gs.Number,xs=gs.Hash,Ss=gs.Colon,Cs=gs.LeftSquareBracket,As={getNode:function(e){switch(this.scanner.tokenType){case Cs:return this.AttributeSelector();case xs:return this.IdSelector();case Ss:return this.scanner.lookupType(1)===Ss?this.PseudoElementSelector():this.PseudoClassSelector();case ys:return this.TypeSelector();case ws:case ks:return this.Percentage();case vs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case bs:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},zs=we.TYPE,Ps=Fr.mode,Ls=zs.Comma,Ts=zs.WhiteSpace,Es={AtrulePrelude:fs,Selector:As,Value:{getNode:ms,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===Ls){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ps.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ts){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n)}return e}}},Os=we.TYPE,Ds=Os.String,Is=Os.Ident,Rs=Os.Url,Ns=Os.Function,Bs=Os.LeftParenthesis,Ms={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Ds:e.push(this.String());break;case Rs:case Ns:e.push(this.Url());break;default:this.error("String or url() is expected")}return this.lookupNonWSType(0)!==Is&&this.lookupNonWSType(0)!==Bs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},js=we.TYPE,_s=js.WhiteSpace,qs=js.Comment,Ws=js.Ident,Fs=js.Function,Us=js.Colon,Ys=js.LeftParenthesis;function Hs(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function Vs(){return this.scanner.skipSC(),this.scanner.tokenType===Ws&&this.lookupNonWSType(1)===Us?this.createSingleNodeList(this.Declaration()):Ks.call(this)}function Ks(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case _s:n=this.WhiteSpace();continue;case qs:this.scanner.next();continue;case Fs:e=this.Function(Hs,this.scope.AtrulePrelude);break;case Ws:e=this.Identifier();break;case Ys:e=this.Parentheses(Vs,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e)}return t}var Gs,$s={parse:function(){return this.createSingleNodeList(this.SelectorList())}},Qs={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},Xs={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},Zs={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Es,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Ms,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=Ks.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:$s,not:$s,"nth-child":Qs,"nth-last-child":Qs,"nth-last-of-type":Xs,"nth-of-type":Xs,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:Xo},Js={node:Xo},el=(Gs=Object.freeze({__proto__:null,version:"1.1.2",default:{version:"1.1.2"}}))&&Gs.default||Gs,tl=function(e){return kr(vr({},e))}(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}(Zo,Zs,Js)),nl=el.version;return tl.version=nl,tl}()})),n=Object.prototype.hasOwnProperty;function r(e,t){var n=Object.create(null);if(!Array.isArray(e))return null;for(var r=0;r<e.length;r++){var a=e[r];t&&(a=a.toLowerCase()),n[a]=!0}return n}function a(e){if(!e)return null;var t=r(e.tags,!0),n=r(e.ids),a=r(e.classes);return null===t&&null===n&&null===a?null:{tags:t,ids:n,classes:a}}var i={buildIndex:function(e){var t=!1;if(e.scopes&&Array.isArray(e.scopes)){t=Object.create(null);for(var r=0;r<e.scopes.length;r++){var i=e.scopes[r];if(!i||!Array.isArray(i))throw new Error("Wrong usage format");for(var o=0;o<i.length;o++){var s=i[o];if(n.call(t,s))throw new Error("Class can't be used for several scopes: "+s);t[s]=r+1}}}return{whitelist:a(e),blacklist:a(e.blacklist),scopes:t}}},o={hasNoChildren:function(e){return!e||!e.children||e.children.isEmpty()},isNodeChildrenList:function(e,t){return null!==e&&e.children===t}},s=t.keyword,{hasNoChildren:l}=o,c=t.property,{isNodeChildrenList:u}=o,h=Object.prototype.hasOwnProperty,d=t.walk,{hasNoChildren:p}=o;var{isNodeChildrenList:m}=o;function f(e){return"Operator"===e.type&&"+"!==e.value&&"-"!==e.value}var g=t.walk,b={Atrule:function(e,t,n){if(e.block&&(null!==this.stylesheet&&(this.stylesheet.firstAtrulesAllowed=!1),l(e.block)))n.remove(t);else switch(e.name){case"charset":if(l(e.prelude))return void n.remove(t);if(t.prev)return void n.remove(t);break;case"import":if(null===this.stylesheet||!this.stylesheet.firstAtrulesAllowed)return void n.remove(t);n.prevUntil(t.prev,(function(e){if("Atrule"!==e.type||"import"!==e.name&&"charset"!==e.name)return this.root.firstAtrulesAllowed=!1,n.remove(t),!0}),this);break;default:var r=s(e.name).basename;"keyframes"!==r&&"media"!==r&&"supports"!==r||(l(e.prelude)||l(e.block))&&n.remove(t)}},Comment:function(e,t,n){n.remove(t)},Declaration:function(e,t,n){e.value.children&&e.value.children.isEmpty()?n.remove(t):c(e.property).custom&&/\S/.test(e.value.value)&&(e.value.value=e.value.value.trim())},Raw:function(e,t,n){(u(this.stylesheet,n)||u(this.block,n))&&n.remove(t)},Rule:function(e,t,n,r){if(p(e.prelude)||p(e.block))n.remove(t);else{var a=r.usage;!a||null===a.whitelist&&null===a.blacklist||(function e(t,n){return t.children.each((function(r,a,i){var o=!1;d(r,(function(r){if(null===this.selector||this.selector===t)switch(r.type){case"SelectorList":null!==this.function&&"not"===this.function.name.toLowerCase()||e(r,n)&&(o=!0);break;case"ClassSelector":null===n.whitelist||null===n.whitelist.classes||h.call(n.whitelist.classes,r.name)||(o=!0),null!==n.blacklist&&null!==n.blacklist.classes&&h.call(n.blacklist.classes,r.name)&&(o=!0);break;case"IdSelector":null===n.whitelist||null===n.whitelist.ids||h.call(n.whitelist.ids,r.name)||(o=!0),null!==n.blacklist&&null!==n.blacklist.ids&&h.call(n.blacklist.ids,r.name)&&(o=!0);break;case"TypeSelector":"*"!==r.name.charAt(r.name.length-1)&&(null===n.whitelist||null===n.whitelist.tags||h.call(n.whitelist.tags,r.name.toLowerCase())||(o=!0),null!==n.blacklist&&null!==n.blacklist.tags&&h.call(n.blacklist.tags,r.name.toLowerCase())&&(o=!0))}})),o&&i.remove(a)})),t.children.isEmpty()}(e.prelude,a),!p(e.prelude))||n.remove(t)}},TypeSelector:function(e,t,n){if("*"===t.data.name){var r=t.next&&t.next.data.type;"IdSelector"!==r&&"ClassSelector"!==r&&"AttributeSelector"!==r&&"PseudoClassSelector"!==r&&"PseudoElementSelector"!==r||n.remove(t)}},WhiteSpace:function(e,t,n){null!==t.next&&null!==t.prev?m(this.stylesheet,n)||m(this.block,n)?n.remove(t):"WhiteSpace"!==t.next.data.type?(f(t.prev.data)||f(t.next.data))&&n.remove(t):n.remove(t):n.remove(t)}},y=t.keyword,v=/\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g,k=/^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;var w=t.List;var x=function(e){e.children.each((function(e,t,n){"Identifier"===e.type&&"none"===e.name.toLowerCase()&&(n.head===n.tail?t.data={type:"Number",loc:e.loc,value:"0"}:function(e,t){var n=t.prev,r=t.next;null!==r?"WhiteSpace"!==r.data.type||null!==n&&"WhiteSpace"!==n.data.type||e.remove(r):null!==n&&"WhiteSpace"===n.data.type&&e.remove(n),e.remove(t)}(n,t))}))},S=t.property,C={font:function(e){var t=e.children;t.eachRight((function(e,t){if("Identifier"===e.type)if("bold"===e.name)t.data={type:"Number",loc:e.loc,value:"700"};else if("normal"===e.name){var n=t.prev;n&&"Operator"===n.data.type&&"/"===n.data.value&&this.remove(n),this.remove(t)}else if("medium"===e.name){var r=t.next;r&&"Operator"===r.data.type||this.remove(t)}})),t.each((function(e,t){"WhiteSpace"===e.type&&(t.prev&&t.next&&"WhiteSpace"!==t.next.data.type||this.remove(t))})),t.isEmpty()&&t.insert(t.createItem({type:"Identifier",name:"normal"}))},"font-weight":function(e){var t=e.children.head.data;if("Identifier"===t.type)switch(t.name){case"normal":e.children.head.data={type:"Number",loc:t.loc,value:"400"};break;case"bold":e.children.head.data={type:"Number",loc:t.loc,value:"700"}}},background:function(e){function t(){if(a.length)return a[a.length-1].type}function n(){"WhiteSpace"===t()&&a.pop(),a.length||a.unshift({type:"Number",loc:null,value:"0"},{type:"WhiteSpace",value:" "},{type:"Number",loc:null,value:"0"}),r.push.apply(r,a),a=[]}var r=[],a=[];e.children.each((function(e){if("Operator"===e.type&&","===e.value)return n(),void r.push(e);("Identifier"!==e.type||"transparent"!==e.name&&"none"!==e.name&&"repeat"!==e.name&&"scroll"!==e.name)&&("WhiteSpace"!==e.type||a.length&&"WhiteSpace"!==t())&&a.push(e)})),n(),e.children=(new w).fromArray(r)},border:x,outline:x},A=/^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/,z=/^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/,P={Dimension:!0,Hash:!0,Identifier:!0,Number:!0,Raw:!0,UnicodeRange:!0};function L(e,t){var n=t&&null!==t.prev&&P.hasOwnProperty(t.prev.data.type)?z:A;return""!==(e=String(e).replace(n,"$1$2$3"))&&"-"!==e||(e="0"),e}var T=function(e,t){e.value=L(e.value,t)},E=T.pack=L,O={calc:!0,min:!0,max:!0,clamp:!0},D={px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0},I=t.lexer,R=T.pack,N=new Set(["width","min-width","max-width","height","min-height","max-height","flex","-ms-flex"]),B=new RegExp("^((\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?|\\\\[^\\n\\r\\f0-9a-fA-F])|[^\"'\\(\\)\\\\\\s\0\b\v-])*$","i"),M=t.lexer,j=T.pack,_={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgrey:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",grey:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"639",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},q={8e5:"maroon",800080:"purple",808e3:"olive",808080:"gray","00ffff":"cyan",f0ffff:"azure",f5f5dc:"beige",ffe4c4:"bisque","000000":"black","0000ff":"blue",a52a2a:"brown",ff7f50:"coral",ffd700:"gold","008000":"green","4b0082":"indigo",fffff0:"ivory",f0e68c:"khaki","00ff00":"lime",faf0e6:"linen","000080":"navy",ffa500:"orange",da70d6:"orchid",cd853f:"peru",ffc0cb:"pink",dda0dd:"plum",f00:"red",ff0000:"red",fa8072:"salmon",a0522d:"sienna",c0c0c0:"silver",fffafa:"snow",d2b48c:"tan","008080":"teal",ff6347:"tomato",ee82ee:"violet",f5deb3:"wheat",ffffff:"white",ffff00:"yellow"};function W(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function F(e,t,n,r){var a,i,o;if(0===t)a=i=o=n;else{var s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;a=W(l,s,e+1/3),i=W(l,s,e),o=W(l,s,e-1/3)}return[Math.round(255*a),Math.round(255*i),Math.round(255*o),r]}function U(e){return 1===(e=e.toString(16)).length?"0"+e:e}function Y(e,t,n){for(var r=e.head,a=[],i=!1;null!==r;){var o=r.data,s=o.type;switch(s){case"Number":case"Percentage":if(i)return;i=!0,a.push({type:s,value:Number(o.value)});break;case"Operator":if(","===o.value){if(!i)return;i=!1}else if(i||"+"!==o.value)return;break;default:return}r=r.next}if(a.length===t){if(4===a.length){if("Number"!==a[3].type)return;a[3].type="Alpha"}if(n){if(a[0].type!==a[1].type||a[0].type!==a[2].type)return}else{if("Number"!==a[0].type||"Percentage"!==a[1].type||"Percentage"!==a[2].type)return;a[0].type="Angle"}return a.map((function(e){var t=Math.max(0,e.value);switch(e.type){case"Number":t=Math.min(t,255);break;case"Percentage":if(t=Math.min(t,100)/100,!n)return t;t*=255;break;case"Angle":return(t%360+360)%360/360;case"Alpha":return Math.min(t,1)}return Math.round(t)}))}}function H(e,t){var n=e.value.toLowerCase();6===n.length&&n[0]===n[1]&&n[2]===n[3]&&n[4]===n[5]&&(n=n[0]+n[2]+n[4]),q[n]?t.data={type:"Identifier",loc:e.loc,name:q[n]}:e.value=n}var V={compressFunction:function(e,t,n){var r,a=e.name;if("rgba"===a||"hsla"===a){if(!(r=Y(e.children,4,"rgba"===a)))return;if("hsla"===a&&(r=F.apply(null,r),e.name="rgba"),0===r[3]){var i=this.function&&this.function.name;if(0===r[0]&&0===r[1]&&0===r[2]||!/^(?:to|from|color-stop)$|gradient$/i.test(i))return void(t.data={type:"Identifier",loc:e.loc,name:"transparent"})}if(1!==r[3])return void e.children.each((function(e,t,n){"Operator"!==e.type?t.data={type:"Number",loc:e.loc,value:j(r.shift(),null)}:","!==e.value&&n.remove(t)}));a="rgb"}if("hsl"===a){if(!(r=r||Y(e.children,3,!1)))return;r=F.apply(null,r),a="rgb"}if("rgb"===a){if(!(r=r||Y(e.children,3,!0)))return;var o=t.next;o&&"WhiteSpace"!==o.data.type&&n.insert(n.createItem({type:"WhiteSpace",value:" "}),o),t.data={type:"Hash",loc:e.loc,value:U(r[0])+U(r[1])+U(r[2])},H(t.data,t)}},compressIdent:function(e,t){if(null!==this.declaration){var n=e.name.toLowerCase();if(_.hasOwnProperty(n)&&M.matchDeclaration(this.declaration).isType(e,"color")){var r=_[n];r.length+1<=n.length?t.data={type:"Hash",loc:e.loc,value:r}:("grey"===n&&(n="gray"),e.name=n)}}},compressHex:H},K=t.walk,G={Atrule:function(e){"keyframes"===y(e.name).basename&&function(e){e.block.children.each((function(e){e.prelude.children.each((function(e){e.children.each((function(e,t){"Percentage"===e.type&&"100"===e.value?t.data={type:"TypeSelector",loc:e.loc,name:"to"}:"TypeSelector"===e.type&&"from"===e.name&&(t.data={type:"Percentage",loc:e.loc,value:"0"})}))}))}))}(e)},AttributeSelector:function(e){var t=e.value;if(t&&"String"===t.type){var n=t.value.replace(/^(.)(.*)\1$/,"$2");(function(e){if(""!==e&&"-"!==e)return e=e.replace(v,"a"),!k.test(e)})(n)&&(e.value={type:"Identifier",loc:t.loc,name:n})}},Value:function(e){if(this.declaration){var t=S(this.declaration.property);C.hasOwnProperty(t.basename)&&C[t.basename](e)}},Dimension:function(e,t){var n=E(e.value,t);if(e.value=n,"0"===n&&null!==this.declaration&&null===this.atrulePrelude){var r=e.unit.toLowerCase();if(!D.hasOwnProperty(r))return;if("-ms-flex"===this.declaration.property||"flex"===this.declaration.property)return;if(this.function&&O.hasOwnProperty(this.function.name))return;t.data={type:"Number",loc:e.loc,value:n}}},Percentage:function(e,t){e.value=R(e.value,t),"0"===e.value&&this.declaration&&!N.has(this.declaration.property)&&(t.data={type:"Number",loc:e.loc,value:e.value},I.matchDeclaration(this.declaration).isType(t.data,"length")||(t.data=e))},Number:T,String:function(e){var t=e.value;t=t.replace(/\\(\r\n|\r|\n|\f)/g,""),e.value=t},Url:function(e){var t=e.value;if("String"===t.type){var n=t.value[0],r=t.value.substr(1,t.value.length-2);r=r.replace(/\\\\/g,"/"),B.test(r)?e.value={type:"Raw",loc:e.value.loc,value:r}:e.value.value=-1===r.indexOf('"')?'"'+r+'"':n+r+n}},Hash:V.compressHex,Identifier:V.compressIdent,Function:V.compressFunction},$=t.generate;function Q(){this.seed=0,this.map=Object.create(null)}Q.prototype.resolve=function(e){var t=this.map[e];return t||(t=++this.seed,this.map[e]=t),t};var X=t.generate,Z={"first-letter":!0,"first-line":!0,after:!0,before:!0},J={link:!0,visited:!0,hover:!0,active:!0,"first-letter":!0,"first-line":!0,after:!0,before:!0},ee=t.keyword,te=t.walk,ne=t.generate,re=function(e,t){var n,r=(n=new Q,function(e){var t=$(e);return e.id=n.resolve(t),e.length=t.length,e.fingerprint=null,e});return te(e,{visit:"Rule",enter:function(e){e.block.children.each(r),function(e,t){var n=Object.create(null),r=!1;e.prelude.children.each((function(e){var a="*",i=0;e.children.each((function(o){switch(o.type){case"ClassSelector":if(t&&t.scopes){var s=t.scopes[o.name]||0;if(0!==i&&s!==i)throw new Error("Selector can't has classes from different scopes: "+X(e));i=s}break;case"PseudoClassSelector":var l=o.name.toLowerCase();J.hasOwnProperty(l)||(n[":"+l]=!0,r=!0);break;case"PseudoElementSelector":l=o.name.toLowerCase();Z.hasOwnProperty(l)||(n["::"+l]=!0,r=!0);break;case"TypeSelector":a=o.name.toLowerCase();break;case"AttributeSelector":o.flags&&(n["["+o.flags.toLowerCase()+"]"]=!0,r=!0);break;case"WhiteSpace":case"Combinator":a="*"}})),e.compareMarker=function(e){var t=0,n=0,r=0;return e.children.each((function e(a){switch(a.type){case"SelectorList":case"Selector":a.children.each(e);break;case"IdSelector":t++;break;case"ClassSelector":case"AttributeSelector":n++;break;case"PseudoClassSelector":switch(a.name.toLowerCase()){case"not":a.children.each(e);break;case"before":case"after":case"first-line":case"first-letter":r++;break;default:n++}break;case"PseudoElementSelector":r++;break;case"TypeSelector":"*"!==a.name.charAt(a.name.length-1)&&r++}})),[t,n,r]}(e).toString(),e.id=null,e.id=X(e),i&&(e.compareMarker+=":"+i),"*"!==a&&(e.compareMarker+=","+a)})),e.pseudoSignature=r&&Object.keys(n).sort().join(",")}(e,t.usage)}}),te(e,{visit:"Atrule",enter:function(e){e.prelude&&(e.prelude.id=null,e.prelude.id=ne(e.prelude)),"keyframes"===ee(e.name).basename&&(e.block.avoidRulesMerge=!0,e.block.children.each((function(e){e.prelude.children.each((function(e){e.compareMarker=e.id}))})))}}),{declaration:r}},ae=t.List,ie=t.keyword,oe=Object.prototype.hasOwnProperty,se=t.walk;function le(e,t,n,r){var a=t.data,i=ie(a.name).basename,o=a.name.toLowerCase()+"/"+(a.prelude?a.prelude.id:null);oe.call(e,i)||(e[i]=Object.create(null)),r&&delete e[i][o],oe.call(e[i],o)||(e[i][o]=new ae),e[i][o].append(n.remove(t))}function ce(e){return"Atrule"===e.type&&"media"===e.name}function ue(e,t,n){if(ce(e)){var r=t.prev&&t.prev.data;r&&ce(r)&&e.prelude&&r.prelude&&e.prelude.id===r.prelude.id&&(r.block.children.appendList(e.block.children),n.remove(t))}}var he=function(e,t){!function(e,t){var n=Object.create(null),r=null;for(var a in e.children.each((function(e,a,i){if("Atrule"===e.type){var o=ie(e.name).basename;switch(o){case"keyframes":return void le(n,a,i,!0);case"media":if(t.forceMediaMerge)return void le(n,a,i,!1)}null===r&&"charset"!==o&&"import"!==o&&(r=a)}else null===r&&(r=a)})),n)for(var i in n[a])e.children.insertList(n[a][i],"media"===a?null:r)}(e,t),se(e,{visit:"Atrule",reverse:!0,enter:ue})},de=Object.prototype.hasOwnProperty;function pe(e,t){for(var n=e.head;null!==n;){for(var r=t.head;null!==r;){if(n.data.compareMarker===r.data.compareMarker)return!0;r=r.next}n=n.next}return!1}var me={isEqualSelectors:function(e,t){for(var n=e.head,r=t.head;null!==n&&null!==r&&n.data.id===r.data.id;)n=n.next,r=r.next;return null===n&&null===r},isEqualDeclarations:function(e,t){for(var n=e.head,r=t.head;null!==n&&null!==r&&n.data.id===r.data.id;)n=n.next,r=r.next;return null===n&&null===r},compareDeclarations:function(e,t){for(var n={eq:[],ne1:[],ne2:[],ne2overrided:[]},r=Object.create(null),a=Object.create(null),i=t.head;i;i=i.next)a[i.data.id]=!0;for(i=e.head;i;i=i.next){(o=i.data).fingerprint&&(r[o.fingerprint]=o.important),a[o.id]?(a[o.id]=!1,n.eq.push(o)):n.ne1.push(o)}for(i=t.head;i;i=i.next){var o;a[(o=i.data).id]&&((!de.call(r,o.fingerprint)||!r[o.fingerprint]&&o.important)&&n.ne2.push(o),n.ne2overrided.push(o))}return n},addSelectors:function(e,t){return t.each((function(t){for(var n=t.id,r=e.head;r;){var a=r.data.id;if(a===n)return;if(a>n)break;r=r.next}e.insert(e.createItem(t),r)})),e},hasSimilarSelectors:pe,unsafeToSkipNode:function e(t){switch(t.type){case"Rule":return pe(t.prelude.children,this);case"Atrule":if(t.block)return t.block.children.some(e,this);break;case"Declaration":return!1}return!0}},fe=t.walk;function ge(e,t,n){var r=e.prelude.children,a=e.block.children;n.prevUntil(t.prev,(function(i){if("Rule"!==i.type)return me.unsafeToSkipNode.call(r,i);var o=i.prelude.children,s=i.block.children;if(e.pseudoSignature===i.pseudoSignature){if(me.isEqualSelectors(o,r))return s.appendList(a),n.remove(t),!0;if(me.isEqualDeclarations(a,s))return me.addSelectors(o,r),n.remove(t),!0}return me.hasSimilarSelectors(r,o)}))}var be=t.List,ye=t.walk;function ve(e,t,n){for(var r=e.prelude.children;r.head!==r.tail;){var a=new be;a.insert(r.remove(r.head)),n.insert(n.createItem({type:"Rule",loc:e.loc,prelude:{type:"SelectorList",loc:e.prelude.loc,children:a},block:{type:"Block",loc:e.block.loc,children:e.block.children.copy()},pseudoSignature:e.pseudoSignature}),t)}}var ke=t.List,we=t.generate,xe=t.walk,Se=["top","right","bottom","left"],Ce={"margin-top":"top","margin-right":"right","margin-bottom":"bottom","margin-left":"left","padding-top":"top","padding-right":"right","padding-bottom":"bottom","padding-left":"left","border-top-color":"top","border-right-color":"right","border-bottom-color":"bottom","border-left-color":"left","border-top-width":"top","border-right-width":"right","border-bottom-width":"bottom","border-left-width":"left","border-top-style":"top","border-right-style":"right","border-bottom-style":"bottom","border-left-style":"left"},Ae={margin:"margin","margin-top":"margin","margin-right":"margin","margin-bottom":"margin","margin-left":"margin",padding:"padding","padding-top":"padding","padding-right":"padding","padding-bottom":"padding","padding-left":"padding","border-color":"border-color","border-top-color":"border-color","border-right-color":"border-color","border-bottom-color":"border-color","border-left-color":"border-color","border-width":"border-width","border-top-width":"border-width","border-right-width":"border-width","border-bottom-width":"border-width","border-left-width":"border-width","border-style":"border-style","border-top-style":"border-style","border-right-style":"border-style","border-bottom-style":"border-style","border-left-style":"border-style"};function ze(e){this.name=e,this.loc=null,this.iehack=void 0,this.sides={top:null,right:null,bottom:null,left:null}}function Pe(e,t,n,r){var a=e.block.children,i=e.prelude.children.first().id;return e.block.children.eachRight((function(e,o){var s=e.property;if(Ae.hasOwnProperty(s)){var l,c,u=Ae[s];r&&i!==r||u in t&&(c=2,l=t[u]),l&&l.add(s,e)||(c=1,(l=new ze(u)).add(s,e))?(t[u]=l,n.push({operation:c,block:a,item:o,shorthand:l}),r=i):r=null}})),r}ze.prototype.getValueSequence=function(e,t){var n=[],r="";return!("Value"!==e.value.type||e.value.children.some((function(t){var a=!1;switch(t.type){case"Identifier":switch(t.name){case"\\0":case"\\9":return void(r=t.name);case"inherit":case"initial":case"unset":case"revert":a=t.name}break;case"Dimension":switch(t.unit){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":a=t.unit}break;case"Hash":case"Number":case"Percentage":break;case"Function":if("var"===t.name)return!0;a=t.name;break;case"WhiteSpace":return!1;default:return!0}n.push({node:t,special:a,important:e.important})}))||n.length>t)&&(("string"!=typeof this.iehack||this.iehack===r)&&(this.iehack=r,n))},ze.prototype.canOverride=function(e,t){var n=this.sides[e];return!n||t.important&&!n.important},ze.prototype.add=function(e,t){return!!function(){var n=this.sides,r=Ce[e];if(r){if(r in n==!1)return!1;if(!(i=this.getValueSequence(t,1))||!i.length)return!1;for(var a in n)if(null!==n[a]&&n[a].special!==i[0].special)return!1;return!this.canOverride(r,i[0])||(n[r]=i[0],!0)}if(e===this.name){var i;if(!(i=this.getValueSequence(t,4))||!i.length)return!1;switch(i.length){case 1:i[1]=i[0],i[2]=i[0],i[3]=i[0];break;case 2:i[2]=i[0],i[3]=i[1];break;case 3:i[3]=i[1]}for(var o=0;o<4;o++)for(var a in n)if(null!==n[a]&&n[a].special!==i[o].special)return!1;for(o=0;o<4;o++)this.canOverride(Se[o],i[o])&&(n[Se[o]]=i[o]);return!0}}.call(this)&&(this.loc||(this.loc=t.loc),!0)},ze.prototype.isOkToMinimize=function(){var e=this.sides.top,t=this.sides.right,n=this.sides.bottom,r=this.sides.left;if(e&&t&&n&&r){var a=e.important+t.important+n.important+r.important;return 0===a||4===a}return!1},ze.prototype.getValue=function(){var e=new ke,t=this.sides,n=[t.top,t.right,t.bottom,t.left],r=[we(t.top.node),we(t.right.node),we(t.bottom.node),we(t.left.node)];r[3]===r[1]&&(n.pop(),r[2]===r[0]&&(n.pop(),r[1]===r[0]&&n.pop()));for(var a=0;a<n.length;a++)a&&e.appendData({type:"WhiteSpace",value:" "}),e.appendData(n[a].node);return this.iehack&&(e.appendData({type:"WhiteSpace",value:" "}),e.appendData({type:"Identifier",loc:null,name:this.iehack})),{type:"Value",loc:null,children:e}},ze.prototype.getDeclaration=function(){return{type:"Declaration",loc:this.loc,important:this.sides.top.important,property:this.name,value:this.getValue()}};var Le=function(e,t){var n={},r=[];xe(e,{visit:"Rule",reverse:!0,enter:function(e){var t,a,i=this.block||this.stylesheet,o=(e.pseudoSignature||"")+"|"+e.prelude.children.first().id;n.hasOwnProperty(i.id)?t=n[i.id]:(t={lastShortSelector:null},n[i.id]=t),t.hasOwnProperty(o)?a=t[o]:(a={},t[o]=a),t.lastShortSelector=Pe.call(this,e,a,r,t.lastShortSelector)}}),function(e,t){e.forEach((function(e){var n=e.shorthand;n.isOkToMinimize()&&(1===e.operation?e.item.data=t(n.getDeclaration()):e.block.remove(e.item))}))}(r,t.declaration)},Te=t.property,Ee=t.keyword,Oe=t.walk,De=t.generate,Ie=1,Re={src:1},Ne={display:/table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,"text-align":/^(start|end|match-parent|justify-all)$/i},Be={cursor:["auto","crosshair","default","move","text","wait","help","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","pointer","progress","not-allowed","no-drop","vertical-text","all-scroll","col-resize","row-resize"],overflow:["hidden","visible","scroll","auto"],position:["static","relative","absolute","fixed"]},Me={"border-width":["border"],"border-style":["border"],"border-color":["border"],"border-top":["border"],"border-right":["border"],"border-bottom":["border"],"border-left":["border"],"border-top-width":["border-top","border-width","border"],"border-right-width":["border-right","border-width","border"],"border-bottom-width":["border-bottom","border-width","border"],"border-left-width":["border-left","border-width","border"],"border-top-style":["border-top","border-style","border"],"border-right-style":["border-right","border-style","border"],"border-bottom-style":["border-bottom","border-style","border"],"border-left-style":["border-left","border-style","border"],"border-top-color":["border-top","border-color","border"],"border-right-color":["border-right","border-color","border"],"border-bottom-color":["border-bottom","border-color","border"],"border-left-color":["border-left","border-color","border"],"margin-top":["margin"],"margin-right":["margin"],"margin-bottom":["margin"],"margin-left":["margin"],"padding-top":["padding"],"padding-right":["padding"],"padding-bottom":["padding"],"padding-left":["padding"],"font-style":["font"],"font-variant":["font"],"font-weight":["font"],"font-size":["font"],"font-family":["font"],"list-style-type":["list-style"],"list-style-position":["list-style"],"list-style-image":["list-style"]};function je(e,t,n){var r=Te(e).basename;if("background"===r)return e+":"+De(t.value);var a=t.id,i=n[a];if(!i){switch(t.value.type){case"Value":var o="",s="",l={},c=!1;t.value.children.each((function e(t){switch(t.type){case"Value":case"Brackets":case"Parentheses":t.children.each(e);break;case"Raw":c=!0;break;case"Identifier":var n=t.name;o||(o=Ee(n).vendor),/\\[09]/.test(n)&&(s=RegExp.lastMatch),Be.hasOwnProperty(r)?-1===Be[r].indexOf(n)&&(l[n]=!0):Ne.hasOwnProperty(r)&&Ne[r].test(n)&&(l[n]=!0);break;case"Function":n=t.name;if(o||(o=Ee(n).vendor),"rect"===n)t.children.some((function(e){return"Operator"===e.type&&","===e.value}))||(n="rect-backward");l[n+"()"]=!0,t.children.each(e);break;case"Dimension":var a=t.unit;switch(/\\[09]/.test(a)&&(s=RegExp.lastMatch),a){case"rem":case"vw":case"vh":case"vmin":case"vmax":case"vm":l[a]=!0}}})),i=c?"!"+Ie++:"!"+Object.keys(l).sort()+"|"+s+o;break;case"Raw":i="!"+t.value.value;break;default:i=De(t.value)}n[a]=i}return e+i}function _e(e,t,n,r,a){var i=e.block.children;i.eachRight((function(e,t){var n,o=e.property,s=je(o,e,a);(n=r[s])&&!Re.hasOwnProperty(o)?e.important&&!n.item.data.important?(r[s]={block:i,item:t},n.block.remove(n.item)):i.remove(t):(n=function(e,t,n){var r=Te(t.property);if(Me.hasOwnProperty(r.basename))for(var a=Me[r.basename],i=0;i<a.length;i++){var o=je(r.prefix+a[i],t,n),s=e.hasOwnProperty(o)?e[o]:null;if(s&&(!t.important||s.item.data.important))return s}}(r,e,a))?i.remove(t):(e.fingerprint=s,r[s]={block:i,item:t})})),i.isEmpty()&&n.remove(t)}var qe=t.walk;function We(e,t,n){var r=e.prelude.children,a=e.block.children,i=r.first().compareMarker,o={};n.nextUntil(t.next,(function(t,s){if("Rule"!==t.type)return me.unsafeToSkipNode.call(r,t);if(e.pseudoSignature!==t.pseudoSignature)return!0;var l=t.prelude.children.head,c=t.block.children,u=l.data.compareMarker;if(u in o)return!0;if(r.head===r.tail&&r.first().id===l.data.id)return a.appendList(c),void n.remove(s);if(me.isEqualDeclarations(a,c)){var h=l.data.id;return r.some((function(e,t){var n=e.id;return h<n?(r.insert(l,t),!0):t.next?void 0:(r.insert(l),!0)})),void n.remove(s)}if(u===i)return!0;o[u]=!0}))}var Fe=t.List,Ue=t.walk;function Ye(e){var t=0;return e.each((function(e){t+=e.id.length+1})),t-1}function He(e){for(var t=0,n=0;n<e.length;n++)t+=e[n].length;return t+e.length-1}function Ve(e,t,n){var r=null!==this.block&&this.block.avoidRulesMerge,a=e.prelude.children,i=e.block,o=Object.create(null),s=!0,l=!0;n.prevUntil(t.prev,(function(c,u){var h=c.block,d=c.type;if("Rule"!==d){var p=me.unsafeToSkipNode.call(a,c);return!p&&"Atrule"===d&&h&&Ue(h,{visit:"Rule",enter:function(e){e.prelude.children.each((function(e){o[e.compareMarker]=!0}))}}),p}var m=c.prelude.children;if(e.pseudoSignature!==c.pseudoSignature)return!0;if(!(l=!m.some((function(e){return e.compareMarker in o})))&&!s)return!0;if(s&&me.isEqualSelectors(m,a))return h.children.appendList(i.children),n.remove(t),!0;var f=me.compareDeclarations(i.children,h.children);if(f.eq.length){if(!f.ne1.length&&!f.ne2.length)return l&&(me.addSelectors(a,m),n.remove(u)),!0;if(!r)if(f.ne1.length&&!f.ne2.length){var g=Ye(a),b=He(f.eq);s&&g<b&&(me.addSelectors(m,a),i.children=(new Fe).fromArray(f.ne1))}else if(!f.ne1.length&&f.ne2.length){g=Ye(m),b=He(f.eq);l&&g<b&&(me.addSelectors(a,m),h.children=(new Fe).fromArray(f.ne2))}else{var y={type:"SelectorList",loc:null,children:me.addSelectors(m.copy(),a)},v=Ye(y.children)+2;if((b=He(f.eq))>=v){var k=n.createItem({type:"Rule",loc:null,prelude:y,block:{type:"Block",loc:null,children:(new Fe).fromArray(f.eq)},pseudoSignature:e.pseudoSignature});return i.children=(new Fe).fromArray(f.ne1),h.children=(new Fe).fromArray(f.ne2overrided),s?n.insert(k,u):n.insert(k,t),!0}}}s&&(s=!m.some((function(e){return a.some((function(t){return t.compareMarker===e.compareMarker}))}))),m.each((function(e){o[e.compareMarker]=!0}))}))}var Ke=function(e,t){var n=re(e,t);t.logger("prepare",e),he(e,t),t.logger("mergeAtrule",e),function(e){fe(e,{visit:"Rule",enter:ge})}(e),t.logger("initialMergeRuleset",e),function(e){ye(e,{visit:"Rule",reverse:!0,enter:ve})}(e),t.logger("disjoinRuleset",e),Le(e,n),t.logger("restructShorthand",e),function(e){var t={},n=Object.create(null);Oe(e,{visit:"Rule",reverse:!0,enter:function(e,r,a){var i,o,s=this.block||this.stylesheet,l=(e.pseudoSignature||"")+"|"+e.prelude.children.first().id;t.hasOwnProperty(s.id)?i=t[s.id]:(i={},t[s.id]=i),i.hasOwnProperty(l)?o=i[l]:(o={},i[l]=o),_e.call(this,e,r,a,o,n)}})}(e),t.logger("restructBlock",e),function(e){qe(e,{visit:"Rule",enter:We})}(e),t.logger("mergeRuleset",e),function(e){Ue(e,{visit:"Rule",reverse:!0,enter:Ve})}(e),t.logger("restructRuleset",e)},Ge=t.List,$e=t.clone,Qe=t.walk;function Xe(e,t){var n,r=new Ge,a=!1;return e.nextUntil(e.head,(function(e,i,o){if("Comment"===e.type)return t&&"!"===e.value.charAt(0)?!(!a&&!n)||(o.remove(i),void(n=e)):void o.remove(i);"WhiteSpace"!==e.type&&(a=!0),r.insert(o.remove(i))})),{comment:n,stylesheet:{type:"StyleSheet",loc:null,children:r}}}function Ze(e,t,n,r){r.logger("Compress block #"+n,null,!0);var a=1;return"StyleSheet"===e.type&&(e.firstAtrulesAllowed=t,e.id=a++),Qe(e,{visit:"Atrule",enter:function(e){null!==e.block&&(e.block.id=a++)}}),r.logger("init",e),function(e,t){g(e,{leave:function(e,n,r){b.hasOwnProperty(e.type)&&b[e.type].call(this,e,n,r,t)}})}(e,r),r.logger("clean",e),function(e){K(e,{leave:function(e,t,n){G.hasOwnProperty(e.type)&&G[e.type].call(this,e,t,n)}})}(e),r.logger("replace",e),r.restructuring&&Ke(e,r),e}function Je(e){return"restructure"in e?e.restructure:!("restructuring"in e)||e.restructuring}var et,tt=function(e,t){e=e||{type:"StyleSheet",loc:null,children:new Ge};var n,r,a,o,s={logger:"function"==typeof(t=t||{}).logger?t.logger:function(){},restructuring:Je(t),forceMediaMerge:Boolean(t.forceMediaMerge),usage:!!t.usage&&i.buildIndex(t.usage)},l=function(e){var t="comments"in e?e.comments:"exclamation";return"boolean"==typeof t?t=!!t&&"exclamation":"exclamation"!==t&&"first-exclamation"!==t&&(t=!1),t}(t),c=!0,u=new Ge,h=1;t.clone&&(e=$e(e)),"StyleSheet"===e.type?(n=e.children,e.children=u):(o=e,n=(new Ge).appendData({type:"Rule",loc:null,prelude:{type:"SelectorList",loc:null,children:(new Ge).appendData({type:"Selector",loc:null,children:(new Ge).appendData({type:"TypeSelector",loc:null,name:"x"})})},block:o}));do{if(Ze((r=Xe(n,Boolean(l))).stylesheet,c,h++,s),a=r.stylesheet.children,r.comment&&(u.isEmpty()||u.insert(Ge.createItem({type:"Raw",value:"\n"})),u.insert(Ge.createItem(r.comment)),a.isEmpty()||u.insert(Ge.createItem({type:"Raw",value:"\n"}))),c&&!a.isEmpty()){var d=a.last();("Atrule"!==d.type||"import"!==d.name&&"charset"!==d.name)&&(c=!1)}"exclamation"!==l&&(l=!1),u.appendList(a)}while(!n.isEmpty());return{ast:e}},nt={version:"4.2.0"},rt=(et=Object.freeze({__proto__:null,version:"4.2.0",default:nt}))&&et.default||et,at=t.parse,it=t.generate;function ot(e,t,n,r){return t.debug&&console.error("## "+e+" done in %d ms\n",Date.now()-n),r}function st(e){var t,n;return"function"!=typeof(e=function(e){var t={};for(var n in e)t[n]=e[n];return t}(e)).logger&&e.debug&&(e.logger=(t=e.debug,function(e,r){var a=e;if(r&&(a="["+((Date.now()-n)/1e3).toFixed(3)+"s] "+a),t>1&&r){var i=it(r);2===t&&i.length>256&&(i=i.substr(0,256)+"..."),a+="\n "+i+"\n"}console.error(a),n=Date.now()})),e}function lt(e,t,n){Array.isArray(n)||(n=[n]),n.forEach((function(n){n(e,t)}))}function ct(e,t,n){var r=(n=n||{}).filename||"<unknown>",a=ot("parsing",n,Date.now(),at(t,{context:e,filename:r,positions:Boolean(n.sourceMap)}));n.beforeCompress&&ot("beforeCompress",n,Date.now(),lt(a,n,n.beforeCompress));var i,o=ot("compress",n,Date.now(),tt(a,st(n)));return n.afterCompress&&ot("afterCompress",n,Date.now(),lt(o,n,n.afterCompress)),n.sourceMap?ot("generate(sourceMap: true)",n,Date.now(),((i=it(o.ast,{sourceMap:!0})).map._file=r,i.map.setSourceContent(r,t),i)):ot("generate",n,Date.now(),{css:it(o.ast),map:null})}var ut={version:rt.version,minify:function(e,t){return ct("stylesheet",e,t)},minifyBlock:function(e,t){return ct("declarationList",e,t)},syntax:Object.assign({compress:tt},t)},ht=ut.version,dt=ut.minify,pt=ut.minifyBlock,mt=ut.syntax;e.default=ut,e.minify=dt,e.minifyBlock=pt,e.syntax=mt,e.version=ht,Object.defineProperty(e,"__esModule",{value:!0})}));
\ No newline at end of file
diff --git a/node_modules/csso/lib/clean/Atrule.js b/node_modules/csso/lib/clean/Atrule.js
new file mode 100644
index 0000000..9d2ba92
--- /dev/null
+++ b/node_modules/csso/lib/clean/Atrule.js
@@ -0,0 +1,66 @@
+var resolveKeyword = require('css-tree').keyword;
+var { hasNoChildren } = require('./utils');
+
+module.exports = function cleanAtrule(node, item, list) {
+ if (node.block) {
+ // otherwise removed at-rule don't prevent @import for removal
+ if (this.stylesheet !== null) {
+ this.stylesheet.firstAtrulesAllowed = false;
+ }
+
+ if (hasNoChildren(node.block)) {
+ list.remove(item);
+ return;
+ }
+ }
+
+ switch (node.name) {
+ case 'charset':
+ if (hasNoChildren(node.prelude)) {
+ list.remove(item);
+ return;
+ }
+
+ // if there is any rule before @charset -> remove it
+ if (item.prev) {
+ list.remove(item);
+ return;
+ }
+
+ break;
+
+ case 'import':
+ if (this.stylesheet === null || !this.stylesheet.firstAtrulesAllowed) {
+ list.remove(item);
+ return;
+ }
+
+ // if there are some rules that not an @import or @charset before @import
+ // remove it
+ list.prevUntil(item.prev, function(rule) {
+ if (rule.type === 'Atrule') {
+ if (rule.name === 'import' || rule.name === 'charset') {
+ return;
+ }
+ }
+
+ this.root.firstAtrulesAllowed = false;
+ list.remove(item);
+ return true;
+ }, this);
+
+ break;
+
+ default:
+ var name = resolveKeyword(node.name).basename;
+ if (name === 'keyframes' ||
+ name === 'media' ||
+ name === 'supports') {
+
+ // drop at-rule with no prelude
+ if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+ list.remove(item);
+ }
+ }
+ }
+};
diff --git a/node_modules/csso/lib/clean/Comment.js b/node_modules/csso/lib/clean/Comment.js
new file mode 100644
index 0000000..aa80108
--- /dev/null
+++ b/node_modules/csso/lib/clean/Comment.js
@@ -0,0 +1,3 @@
+module.exports = function cleanComment(data, item, list) {
+ list.remove(item);
+};
diff --git a/node_modules/csso/lib/clean/Declaration.js b/node_modules/csso/lib/clean/Declaration.js
new file mode 100644
index 0000000..f3cac37
--- /dev/null
+++ b/node_modules/csso/lib/clean/Declaration.js
@@ -0,0 +1,14 @@
+var property = require('css-tree').property;
+
+module.exports = function cleanDeclartion(node, item, list) {
+ if (node.value.children && node.value.children.isEmpty()) {
+ list.remove(item);
+ return;
+ }
+
+ if (property(node.property).custom) {
+ if (/\S/.test(node.value.value)) {
+ node.value.value = node.value.value.trim();
+ }
+ }
+};
diff --git a/node_modules/csso/lib/clean/Raw.js b/node_modules/csso/lib/clean/Raw.js
new file mode 100644
index 0000000..490f23d
--- /dev/null
+++ b/node_modules/csso/lib/clean/Raw.js
@@ -0,0 +1,9 @@
+var { isNodeChildrenList } = require('./utils');
+
+module.exports = function cleanRaw(node, item, list) {
+ // raw in stylesheet or block children
+ if (isNodeChildrenList(this.stylesheet, list) ||
+ isNodeChildrenList(this.block, list)) {
+ list.remove(item);
+ }
+};
diff --git a/node_modules/csso/lib/clean/Rule.js b/node_modules/csso/lib/clean/Rule.js
new file mode 100644
index 0000000..ec14257
--- /dev/null
+++ b/node_modules/csso/lib/clean/Rule.js
@@ -0,0 +1,93 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var walk = require('css-tree').walk;
+var { hasNoChildren } = require('./utils');
+
+function cleanUnused(selectorList, usageData) {
+ selectorList.children.each(function(selector, item, list) {
+ var shouldRemove = false;
+
+ walk(selector, function(node) {
+ // ignore nodes in nested selectors
+ if (this.selector === null || this.selector === selectorList) {
+ switch (node.type) {
+ case 'SelectorList':
+ // TODO: remove toLowerCase when pseudo selectors will be normalized
+ // ignore selectors inside :not()
+ if (this.function === null || this.function.name.toLowerCase() !== 'not') {
+ if (cleanUnused(node, usageData)) {
+ shouldRemove = true;
+ }
+ }
+ break;
+
+ case 'ClassSelector':
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.classes !== null &&
+ !hasOwnProperty.call(usageData.whitelist.classes, node.name)) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.classes !== null &&
+ hasOwnProperty.call(usageData.blacklist.classes, node.name)) {
+ shouldRemove = true;
+ }
+ break;
+
+ case 'IdSelector':
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.ids !== null &&
+ !hasOwnProperty.call(usageData.whitelist.ids, node.name)) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.ids !== null &&
+ hasOwnProperty.call(usageData.blacklist.ids, node.name)) {
+ shouldRemove = true;
+ }
+ break;
+
+ case 'TypeSelector':
+ // TODO: remove toLowerCase when type selectors will be normalized
+ // ignore universal selectors
+ if (node.name.charAt(node.name.length - 1) !== '*') {
+ if (usageData.whitelist !== null &&
+ usageData.whitelist.tags !== null &&
+ !hasOwnProperty.call(usageData.whitelist.tags, node.name.toLowerCase())) {
+ shouldRemove = true;
+ }
+ if (usageData.blacklist !== null &&
+ usageData.blacklist.tags !== null &&
+ hasOwnProperty.call(usageData.blacklist.tags, node.name.toLowerCase())) {
+ shouldRemove = true;
+ }
+ }
+ break;
+ }
+ }
+ });
+
+ if (shouldRemove) {
+ list.remove(item);
+ }
+ });
+
+ return selectorList.children.isEmpty();
+}
+
+module.exports = function cleanRule(node, item, list, options) {
+ if (hasNoChildren(node.prelude) || hasNoChildren(node.block)) {
+ list.remove(item);
+ return;
+ }
+
+ var usageData = options.usage;
+
+ if (usageData && (usageData.whitelist !== null || usageData.blacklist !== null)) {
+ cleanUnused(node.prelude, usageData);
+
+ if (hasNoChildren(node.prelude)) {
+ list.remove(item);
+ return;
+ }
+ }
+};
diff --git a/node_modules/csso/lib/clean/TypeSelector.js b/node_modules/csso/lib/clean/TypeSelector.js
new file mode 100644
index 0000000..5d40090
--- /dev/null
+++ b/node_modules/csso/lib/clean/TypeSelector.js
@@ -0,0 +1,19 @@
+// remove useless universal selector
+module.exports = function cleanTypeSelector(node, item, list) {
+ var name = item.data.name;
+
+ // check it's a non-namespaced universal selector
+ if (name !== '*') {
+ return;
+ }
+
+ // remove when universal selector before other selectors
+ var nextType = item.next && item.next.data.type;
+ if (nextType === 'IdSelector' ||
+ nextType === 'ClassSelector' ||
+ nextType === 'AttributeSelector' ||
+ nextType === 'PseudoClassSelector' ||
+ nextType === 'PseudoElementSelector') {
+ list.remove(item);
+ }
+};
diff --git a/node_modules/csso/lib/clean/WhiteSpace.js b/node_modules/csso/lib/clean/WhiteSpace.js
new file mode 100644
index 0000000..f3df6e5
--- /dev/null
+++ b/node_modules/csso/lib/clean/WhiteSpace.js
@@ -0,0 +1,30 @@
+var { isNodeChildrenList } = require('./utils');
+
+function isSafeOperator(node) {
+ return node.type === 'Operator' && node.value !== '+' && node.value !== '-';
+}
+
+module.exports = function cleanWhitespace(node, item, list) {
+ // remove when first or last item in sequence
+ if (item.next === null || item.prev === null) {
+ list.remove(item);
+ return;
+ }
+
+ // white space in stylesheet or block children
+ if (isNodeChildrenList(this.stylesheet, list) ||
+ isNodeChildrenList(this.block, list)) {
+ list.remove(item);
+ return;
+ }
+
+ if (item.next.data.type === 'WhiteSpace') {
+ list.remove(item);
+ return;
+ }
+
+ if (isSafeOperator(item.prev.data) || isSafeOperator(item.next.data)) {
+ list.remove(item);
+ return;
+ }
+};
diff --git a/node_modules/csso/lib/clean/index.js b/node_modules/csso/lib/clean/index.js
new file mode 100644
index 0000000..9f6e21a
--- /dev/null
+++ b/node_modules/csso/lib/clean/index.js
@@ -0,0 +1,20 @@
+var walk = require('css-tree').walk;
+var handlers = {
+ Atrule: require('./Atrule'),
+ Comment: require('./Comment'),
+ Declaration: require('./Declaration'),
+ Raw: require('./Raw'),
+ Rule: require('./Rule'),
+ TypeSelector: require('./TypeSelector'),
+ WhiteSpace: require('./WhiteSpace')
+};
+
+module.exports = function(ast, options) {
+ walk(ast, {
+ leave: function(node, item, list) {
+ if (handlers.hasOwnProperty(node.type)) {
+ handlers[node.type].call(this, node, item, list, options);
+ }
+ }
+ });
+};
diff --git a/node_modules/csso/lib/clean/utils.js b/node_modules/csso/lib/clean/utils.js
new file mode 100644
index 0000000..976fb0e
--- /dev/null
+++ b/node_modules/csso/lib/clean/utils.js
@@ -0,0 +1,8 @@
+module.exports = {
+ hasNoChildren: function(node) {
+ return !node || !node.children || node.children.isEmpty();
+ },
+ isNodeChildrenList: function(node, list) {
+ return node !== null && node.children === list;
+ }
+};
diff --git a/node_modules/csso/lib/compress.js b/node_modules/csso/lib/compress.js
new file mode 100644
index 0000000..17be39b
--- /dev/null
+++ b/node_modules/csso/lib/compress.js
@@ -0,0 +1,197 @@
+var List = require('css-tree').List;
+var clone = require('css-tree').clone;
+var usageUtils = require('./usage');
+var clean = require('./clean');
+var replace = require('./replace');
+var restructure = require('./restructure');
+var walk = require('css-tree').walk;
+
+function readChunk(children, specialComments) {
+ var buffer = new List();
+ var nonSpaceTokenInBuffer = false;
+ var protectedComment;
+
+ children.nextUntil(children.head, function(node, item, list) {
+ if (node.type === 'Comment') {
+ if (!specialComments || node.value.charAt(0) !== '!') {
+ list.remove(item);
+ return;
+ }
+
+ if (nonSpaceTokenInBuffer || protectedComment) {
+ return true;
+ }
+
+ list.remove(item);
+ protectedComment = node;
+ return;
+ }
+
+ if (node.type !== 'WhiteSpace') {
+ nonSpaceTokenInBuffer = true;
+ }
+
+ buffer.insert(list.remove(item));
+ });
+
+ return {
+ comment: protectedComment,
+ stylesheet: {
+ type: 'StyleSheet',
+ loc: null,
+ children: buffer
+ }
+ };
+}
+
+function compressChunk(ast, firstAtrulesAllowed, num, options) {
+ options.logger('Compress block #' + num, null, true);
+
+ var seed = 1;
+
+ if (ast.type === 'StyleSheet') {
+ ast.firstAtrulesAllowed = firstAtrulesAllowed;
+ ast.id = seed++;
+ }
+
+ walk(ast, {
+ visit: 'Atrule',
+ enter: function markScopes(node) {
+ if (node.block !== null) {
+ node.block.id = seed++;
+ }
+ }
+ });
+ options.logger('init', ast);
+
+ // remove redundant
+ clean(ast, options);
+ options.logger('clean', ast);
+
+ // replace nodes for shortened forms
+ replace(ast, options);
+ options.logger('replace', ast);
+
+ // structure optimisations
+ if (options.restructuring) {
+ restructure(ast, options);
+ }
+
+ return ast;
+}
+
+function getCommentsOption(options) {
+ var comments = 'comments' in options ? options.comments : 'exclamation';
+
+ if (typeof comments === 'boolean') {
+ comments = comments ? 'exclamation' : false;
+ } else if (comments !== 'exclamation' && comments !== 'first-exclamation') {
+ comments = false;
+ }
+
+ return comments;
+}
+
+function getRestructureOption(options) {
+ if ('restructure' in options) {
+ return options.restructure;
+ }
+
+ return 'restructuring' in options ? options.restructuring : true;
+}
+
+function wrapBlock(block) {
+ return new List().appendData({
+ type: 'Rule',
+ loc: null,
+ prelude: {
+ type: 'SelectorList',
+ loc: null,
+ children: new List().appendData({
+ type: 'Selector',
+ loc: null,
+ children: new List().appendData({
+ type: 'TypeSelector',
+ loc: null,
+ name: 'x'
+ })
+ })
+ },
+ block: block
+ });
+}
+
+module.exports = function compress(ast, options) {
+ ast = ast || { type: 'StyleSheet', loc: null, children: new List() };
+ options = options || {};
+
+ var compressOptions = {
+ logger: typeof options.logger === 'function' ? options.logger : function() {},
+ restructuring: getRestructureOption(options),
+ forceMediaMerge: Boolean(options.forceMediaMerge),
+ usage: options.usage ? usageUtils.buildIndex(options.usage) : false
+ };
+ var specialComments = getCommentsOption(options);
+ var firstAtrulesAllowed = true;
+ var input;
+ var output = new List();
+ var chunk;
+ var chunkNum = 1;
+ var chunkChildren;
+
+ if (options.clone) {
+ ast = clone(ast);
+ }
+
+ if (ast.type === 'StyleSheet') {
+ input = ast.children;
+ ast.children = output;
+ } else {
+ input = wrapBlock(ast);
+ }
+
+ do {
+ chunk = readChunk(input, Boolean(specialComments));
+ compressChunk(chunk.stylesheet, firstAtrulesAllowed, chunkNum++, compressOptions);
+ chunkChildren = chunk.stylesheet.children;
+
+ if (chunk.comment) {
+ // add \n before comment if there is another content in output
+ if (!output.isEmpty()) {
+ output.insert(List.createItem({
+ type: 'Raw',
+ value: '\n'
+ }));
+ }
+
+ output.insert(List.createItem(chunk.comment));
+
+ // add \n after comment if chunk is not empty
+ if (!chunkChildren.isEmpty()) {
+ output.insert(List.createItem({
+ type: 'Raw',
+ value: '\n'
+ }));
+ }
+ }
+
+ if (firstAtrulesAllowed && !chunkChildren.isEmpty()) {
+ var lastRule = chunkChildren.last();
+
+ if (lastRule.type !== 'Atrule' ||
+ (lastRule.name !== 'import' && lastRule.name !== 'charset')) {
+ firstAtrulesAllowed = false;
+ }
+ }
+
+ if (specialComments !== 'exclamation') {
+ specialComments = false;
+ }
+
+ output.appendList(chunkChildren);
+ } while (!input.isEmpty());
+
+ return {
+ ast: ast
+ };
+};
diff --git a/node_modules/csso/lib/index.js b/node_modules/csso/lib/index.js
new file mode 100644
index 0000000..2322e5e
--- /dev/null
+++ b/node_modules/csso/lib/index.js
@@ -0,0 +1,141 @@
+var csstree = require('css-tree');
+var parse = csstree.parse;
+var compress = require('./compress');
+var generate = csstree.generate;
+
+function debugOutput(name, options, startTime, data) {
+ if (options.debug) {
+ console.error('## ' + name + ' done in %d ms\n', Date.now() - startTime);
+ }
+
+ return data;
+}
+
+function createDefaultLogger(level) {
+ var lastDebug;
+
+ return function logger(title, ast) {
+ var line = title;
+
+ if (ast) {
+ line = '[' + ((Date.now() - lastDebug) / 1000).toFixed(3) + 's] ' + line;
+ }
+
+ if (level > 1 && ast) {
+ var css = generate(ast);
+
+ // when level 2, limit css to 256 symbols
+ if (level === 2 && css.length > 256) {
+ css = css.substr(0, 256) + '...';
+ }
+
+ line += '\n ' + css + '\n';
+ }
+
+ console.error(line);
+ lastDebug = Date.now();
+ };
+}
+
+function copy(obj) {
+ var result = {};
+
+ for (var key in obj) {
+ result[key] = obj[key];
+ }
+
+ return result;
+}
+
+function buildCompressOptions(options) {
+ options = copy(options);
+
+ if (typeof options.logger !== 'function' && options.debug) {
+ options.logger = createDefaultLogger(options.debug);
+ }
+
+ return options;
+}
+
+function runHandler(ast, options, handlers) {
+ if (!Array.isArray(handlers)) {
+ handlers = [handlers];
+ }
+
+ handlers.forEach(function(fn) {
+ fn(ast, options);
+ });
+}
+
+function minify(context, source, options) {
+ options = options || {};
+
+ var filename = options.filename || '<unknown>';
+ var result;
+
+ // parse
+ var ast = debugOutput('parsing', options, Date.now(),
+ parse(source, {
+ context: context,
+ filename: filename,
+ positions: Boolean(options.sourceMap)
+ })
+ );
+
+ // before compress handlers
+ if (options.beforeCompress) {
+ debugOutput('beforeCompress', options, Date.now(),
+ runHandler(ast, options, options.beforeCompress)
+ );
+ }
+
+ // compress
+ var compressResult = debugOutput('compress', options, Date.now(),
+ compress(ast, buildCompressOptions(options))
+ );
+
+ // after compress handlers
+ if (options.afterCompress) {
+ debugOutput('afterCompress', options, Date.now(),
+ runHandler(compressResult, options, options.afterCompress)
+ );
+ }
+
+ // generate
+ if (options.sourceMap) {
+ result = debugOutput('generate(sourceMap: true)', options, Date.now(), (function() {
+ var tmp = generate(compressResult.ast, { sourceMap: true });
+ tmp.map._file = filename; // since other tools can relay on file in source map transform chain
+ tmp.map.setSourceContent(filename, source);
+ return tmp;
+ }()));
+ } else {
+ result = debugOutput('generate', options, Date.now(), {
+ css: generate(compressResult.ast),
+ map: null
+ });
+ }
+
+ return result;
+}
+
+function minifyStylesheet(source, options) {
+ return minify('stylesheet', source, options);
+}
+
+function minifyBlock(source, options) {
+ return minify('declarationList', source, options);
+}
+
+module.exports = {
+ version: require('../package.json').version,
+
+ // main methods
+ minify: minifyStylesheet,
+ minifyBlock: minifyBlock,
+
+ // css syntax parser/walkers/generator/etc
+ syntax: Object.assign({
+ compress: compress
+ }, csstree)
+};
diff --git a/node_modules/csso/lib/replace/Atrule.js b/node_modules/csso/lib/replace/Atrule.js
new file mode 100644
index 0000000..b64245c
--- /dev/null
+++ b/node_modules/csso/lib/replace/Atrule.js
@@ -0,0 +1,9 @@
+var resolveKeyword = require('css-tree').keyword;
+var compressKeyframes = require('./atrule/keyframes');
+
+module.exports = function(node) {
+ // compress @keyframe selectors
+ if (resolveKeyword(node.name).basename === 'keyframes') {
+ compressKeyframes(node);
+ }
+};
diff --git a/node_modules/csso/lib/replace/AttributeSelector.js b/node_modules/csso/lib/replace/AttributeSelector.js
new file mode 100644
index 0000000..72ad9e0
--- /dev/null
+++ b/node_modules/csso/lib/replace/AttributeSelector.js
@@ -0,0 +1,33 @@
+// Can unquote attribute detection
+// Adopted implementation of Mathias Bynens
+// https://github.com/mathiasbynens/mothereff.in/blob/master/unquoted-attributes/eff.js
+var escapesRx = /\\([0-9A-Fa-f]{1,6})(\r\n|[ \t\n\f\r])?|\\./g;
+var blockUnquoteRx = /^(-?\d|--)|[\u0000-\u002c\u002e\u002f\u003A-\u0040\u005B-\u005E\u0060\u007B-\u009f]/;
+
+function canUnquote(value) {
+ if (value === '' || value === '-') {
+ return;
+ }
+
+ // Escapes are valid, so replace them with a valid non-empty string
+ value = value.replace(escapesRx, 'a');
+
+ return !blockUnquoteRx.test(value);
+}
+
+module.exports = function(node) {
+ var attrValue = node.value;
+
+ if (!attrValue || attrValue.type !== 'String') {
+ return;
+ }
+
+ var unquotedValue = attrValue.value.replace(/^(.)(.*)\1$/, '$2');
+ if (canUnquote(unquotedValue)) {
+ node.value = {
+ type: 'Identifier',
+ loc: attrValue.loc,
+ name: unquotedValue
+ };
+ }
+};
diff --git a/node_modules/csso/lib/replace/Dimension.js b/node_modules/csso/lib/replace/Dimension.js
new file mode 100644
index 0000000..036a94c
--- /dev/null
+++ b/node_modules/csso/lib/replace/Dimension.js
@@ -0,0 +1,62 @@
+var packNumber = require('./Number').pack;
+var MATH_FUNCTIONS = {
+ 'calc': true,
+ 'min': true,
+ 'max': true,
+ 'clamp': true
+};
+var LENGTH_UNIT = {
+ // absolute length units
+ 'px': true,
+ 'mm': true,
+ 'cm': true,
+ 'in': true,
+ 'pt': true,
+ 'pc': true,
+
+ // relative length units
+ 'em': true,
+ 'ex': true,
+ 'ch': true,
+ 'rem': true,
+
+ // viewport-percentage lengths
+ 'vh': true,
+ 'vw': true,
+ 'vmin': true,
+ 'vmax': true,
+ 'vm': true
+};
+
+module.exports = function compressDimension(node, item) {
+ var value = packNumber(node.value, item);
+
+ node.value = value;
+
+ if (value === '0' && this.declaration !== null && this.atrulePrelude === null) {
+ var unit = node.unit.toLowerCase();
+
+ // only length values can be compressed
+ if (!LENGTH_UNIT.hasOwnProperty(unit)) {
+ return;
+ }
+
+ // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+ // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+ if (this.declaration.property === '-ms-flex' ||
+ this.declaration.property === 'flex') {
+ return;
+ }
+
+ // issue #222: don't remove units inside calc
+ if (this.function && MATH_FUNCTIONS.hasOwnProperty(this.function.name)) {
+ return;
+ }
+
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: value
+ };
+ }
+};
diff --git a/node_modules/csso/lib/replace/Number.js b/node_modules/csso/lib/replace/Number.js
new file mode 100644
index 0000000..f3bd526
--- /dev/null
+++ b/node_modules/csso/lib/replace/Number.js
@@ -0,0 +1,39 @@
+var OMIT_PLUSSIGN = /^(?:\+|(-))?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+var KEEP_PLUSSIGN = /^([\+\-])?0*(\d*)(?:\.0*|(\.\d*?)0*)?$/;
+var unsafeToRemovePlusSignAfter = {
+ Dimension: true,
+ Hash: true,
+ Identifier: true,
+ Number: true,
+ Raw: true,
+ UnicodeRange: true
+};
+
+function packNumber(value, item) {
+ // omit plus sign only if no prev or prev is safe type
+ var regexp = item && item.prev !== null && unsafeToRemovePlusSignAfter.hasOwnProperty(item.prev.data.type)
+ ? KEEP_PLUSSIGN
+ : OMIT_PLUSSIGN;
+
+ // 100 -> '100'
+ // 00100 -> '100'
+ // +100 -> '100' (only when safe, e.g. omitting plus sign for 1px+1px leads to single dimension instead of two)
+ // -100 -> '-100'
+ // 0.123 -> '.123'
+ // 0.12300 -> '.123'
+ // 0.0 -> ''
+ // 0 -> ''
+ // -0 -> '-'
+ value = String(value).replace(regexp, '$1$2$3');
+
+ if (value === '' || value === '-') {
+ value = '0';
+ }
+
+ return value;
+}
+
+module.exports = function(node, item) {
+ node.value = packNumber(node.value, item);
+};
+module.exports.pack = packNumber;
diff --git a/node_modules/csso/lib/replace/Percentage.js b/node_modules/csso/lib/replace/Percentage.js
new file mode 100644
index 0000000..2382b15
--- /dev/null
+++ b/node_modules/csso/lib/replace/Percentage.js
@@ -0,0 +1,36 @@
+var lexer = require('css-tree').lexer;
+var packNumber = require('./Number').pack;
+var blacklist = new Set([
+ // see https://github.com/jakubpawlowicz/clean-css/issues/957
+ 'width',
+ 'min-width',
+ 'max-width',
+ 'height',
+ 'min-height',
+ 'max-height',
+
+ // issue #410: Don’t remove units in flex-basis value for (-ms-)flex shorthand
+ // issue #362: shouldn't remove unit in -ms-flex since it breaks flex in IE10/11
+ // issue #200: shouldn't remove unit in flex since it breaks flex in IE10/11
+ 'flex',
+ '-ms-flex'
+]);
+
+module.exports = function compressPercentage(node, item) {
+ node.value = packNumber(node.value, item);
+
+ if (node.value === '0' && this.declaration && !blacklist.has(this.declaration.property)) {
+ // try to convert a number
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: node.value
+ };
+
+ // that's ok only when new value matches on length
+ if (!lexer.matchDeclaration(this.declaration).isType(item.data, 'length')) {
+ // otherwise rollback changes
+ item.data = node;
+ }
+ }
+};
diff --git a/node_modules/csso/lib/replace/String.js b/node_modules/csso/lib/replace/String.js
new file mode 100644
index 0000000..ca9e60d
--- /dev/null
+++ b/node_modules/csso/lib/replace/String.js
@@ -0,0 +1,12 @@
+module.exports = function(node) {
+ var value = node.value;
+
+ // remove escaped newlines, i.e.
+ // .a { content: "foo\
+ // bar"}
+ // ->
+ // .a { content: "foobar" }
+ value = value.replace(/\\(\r\n|\r|\n|\f)/g, '');
+
+ node.value = value;
+};
diff --git a/node_modules/csso/lib/replace/Url.js b/node_modules/csso/lib/replace/Url.js
new file mode 100644
index 0000000..af7f937
--- /dev/null
+++ b/node_modules/csso/lib/replace/Url.js
@@ -0,0 +1,33 @@
+var UNICODE = '\\\\[0-9a-f]{1,6}(\\r\\n|[ \\n\\r\\t\\f])?';
+var ESCAPE = '(' + UNICODE + '|\\\\[^\\n\\r\\f0-9a-fA-F])';
+var NONPRINTABLE = '\u0000\u0008\u000b\u000e-\u001f\u007f';
+var SAFE_URL = new RegExp('^(' + ESCAPE + '|[^\"\'\\(\\)\\\\\\s' + NONPRINTABLE + '])*$', 'i');
+
+module.exports = function(node) {
+ var value = node.value;
+
+ if (value.type !== 'String') {
+ return;
+ }
+
+ var quote = value.value[0];
+ var url = value.value.substr(1, value.value.length - 2);
+
+ // convert `\\` to `/`
+ url = url.replace(/\\\\/g, '/');
+
+ // remove quotes when safe
+ // https://www.w3.org/TR/css-syntax-3/#url-unquoted-diagram
+ if (SAFE_URL.test(url)) {
+ node.value = {
+ type: 'Raw',
+ loc: node.value.loc,
+ value: url
+ };
+ } else {
+ // use double quotes if string has no double quotes
+ // otherwise use original quotes
+ // TODO: make better quote type selection
+ node.value.value = url.indexOf('"') === -1 ? '"' + url + '"' : quote + url + quote;
+ }
+};
diff --git a/node_modules/csso/lib/replace/Value.js b/node_modules/csso/lib/replace/Value.js
new file mode 100644
index 0000000..52e3b65
--- /dev/null
+++ b/node_modules/csso/lib/replace/Value.js
@@ -0,0 +1,20 @@
+var resolveName = require('css-tree').property;
+var handlers = {
+ 'font': require('./property/font'),
+ 'font-weight': require('./property/font-weight'),
+ 'background': require('./property/background'),
+ 'border': require('./property/border'),
+ 'outline': require('./property/border')
+};
+
+module.exports = function compressValue(node) {
+ if (!this.declaration) {
+ return;
+ }
+
+ var property = resolveName(this.declaration.property);
+
+ if (handlers.hasOwnProperty(property.basename)) {
+ handlers[property.basename](node);
+ }
+};
diff --git a/node_modules/csso/lib/replace/atrule/keyframes.js b/node_modules/csso/lib/replace/atrule/keyframes.js
new file mode 100644
index 0000000..229d6d1
--- /dev/null
+++ b/node_modules/csso/lib/replace/atrule/keyframes.js
@@ -0,0 +1,21 @@
+module.exports = function(node) {
+ node.block.children.each(function(rule) {
+ rule.prelude.children.each(function(simpleselector) {
+ simpleselector.children.each(function(data, item) {
+ if (data.type === 'Percentage' && data.value === '100') {
+ item.data = {
+ type: 'TypeSelector',
+ loc: data.loc,
+ name: 'to'
+ };
+ } else if (data.type === 'TypeSelector' && data.name === 'from') {
+ item.data = {
+ type: 'Percentage',
+ loc: data.loc,
+ value: '0'
+ };
+ }
+ });
+ });
+ });
+};
diff --git a/node_modules/csso/lib/replace/color.js b/node_modules/csso/lib/replace/color.js
new file mode 100644
index 0000000..da3ae01
--- /dev/null
+++ b/node_modules/csso/lib/replace/color.js
@@ -0,0 +1,510 @@
+var lexer = require('css-tree').lexer;
+var packNumber = require('./Number').pack;
+
+// http://www.w3.org/TR/css3-color/#svg-color
+var NAME_TO_HEX = {
+ 'aliceblue': 'f0f8ff',
+ 'antiquewhite': 'faebd7',
+ 'aqua': '0ff',
+ 'aquamarine': '7fffd4',
+ 'azure': 'f0ffff',
+ 'beige': 'f5f5dc',
+ 'bisque': 'ffe4c4',
+ 'black': '000',
+ 'blanchedalmond': 'ffebcd',
+ 'blue': '00f',
+ 'blueviolet': '8a2be2',
+ 'brown': 'a52a2a',
+ 'burlywood': 'deb887',
+ 'cadetblue': '5f9ea0',
+ 'chartreuse': '7fff00',
+ 'chocolate': 'd2691e',
+ 'coral': 'ff7f50',
+ 'cornflowerblue': '6495ed',
+ 'cornsilk': 'fff8dc',
+ 'crimson': 'dc143c',
+ 'cyan': '0ff',
+ 'darkblue': '00008b',
+ 'darkcyan': '008b8b',
+ 'darkgoldenrod': 'b8860b',
+ 'darkgray': 'a9a9a9',
+ 'darkgrey': 'a9a9a9',
+ 'darkgreen': '006400',
+ 'darkkhaki': 'bdb76b',
+ 'darkmagenta': '8b008b',
+ 'darkolivegreen': '556b2f',
+ 'darkorange': 'ff8c00',
+ 'darkorchid': '9932cc',
+ 'darkred': '8b0000',
+ 'darksalmon': 'e9967a',
+ 'darkseagreen': '8fbc8f',
+ 'darkslateblue': '483d8b',
+ 'darkslategray': '2f4f4f',
+ 'darkslategrey': '2f4f4f',
+ 'darkturquoise': '00ced1',
+ 'darkviolet': '9400d3',
+ 'deeppink': 'ff1493',
+ 'deepskyblue': '00bfff',
+ 'dimgray': '696969',
+ 'dimgrey': '696969',
+ 'dodgerblue': '1e90ff',
+ 'firebrick': 'b22222',
+ 'floralwhite': 'fffaf0',
+ 'forestgreen': '228b22',
+ 'fuchsia': 'f0f',
+ 'gainsboro': 'dcdcdc',
+ 'ghostwhite': 'f8f8ff',
+ 'gold': 'ffd700',
+ 'goldenrod': 'daa520',
+ 'gray': '808080',
+ 'grey': '808080',
+ 'green': '008000',
+ 'greenyellow': 'adff2f',
+ 'honeydew': 'f0fff0',
+ 'hotpink': 'ff69b4',
+ 'indianred': 'cd5c5c',
+ 'indigo': '4b0082',
+ 'ivory': 'fffff0',
+ 'khaki': 'f0e68c',
+ 'lavender': 'e6e6fa',
+ 'lavenderblush': 'fff0f5',
+ 'lawngreen': '7cfc00',
+ 'lemonchiffon': 'fffacd',
+ 'lightblue': 'add8e6',
+ 'lightcoral': 'f08080',
+ 'lightcyan': 'e0ffff',
+ 'lightgoldenrodyellow': 'fafad2',
+ 'lightgray': 'd3d3d3',
+ 'lightgrey': 'd3d3d3',
+ 'lightgreen': '90ee90',
+ 'lightpink': 'ffb6c1',
+ 'lightsalmon': 'ffa07a',
+ 'lightseagreen': '20b2aa',
+ 'lightskyblue': '87cefa',
+ 'lightslategray': '789',
+ 'lightslategrey': '789',
+ 'lightsteelblue': 'b0c4de',
+ 'lightyellow': 'ffffe0',
+ 'lime': '0f0',
+ 'limegreen': '32cd32',
+ 'linen': 'faf0e6',
+ 'magenta': 'f0f',
+ 'maroon': '800000',
+ 'mediumaquamarine': '66cdaa',
+ 'mediumblue': '0000cd',
+ 'mediumorchid': 'ba55d3',
+ 'mediumpurple': '9370db',
+ 'mediumseagreen': '3cb371',
+ 'mediumslateblue': '7b68ee',
+ 'mediumspringgreen': '00fa9a',
+ 'mediumturquoise': '48d1cc',
+ 'mediumvioletred': 'c71585',
+ 'midnightblue': '191970',
+ 'mintcream': 'f5fffa',
+ 'mistyrose': 'ffe4e1',
+ 'moccasin': 'ffe4b5',
+ 'navajowhite': 'ffdead',
+ 'navy': '000080',
+ 'oldlace': 'fdf5e6',
+ 'olive': '808000',
+ 'olivedrab': '6b8e23',
+ 'orange': 'ffa500',
+ 'orangered': 'ff4500',
+ 'orchid': 'da70d6',
+ 'palegoldenrod': 'eee8aa',
+ 'palegreen': '98fb98',
+ 'paleturquoise': 'afeeee',
+ 'palevioletred': 'db7093',
+ 'papayawhip': 'ffefd5',
+ 'peachpuff': 'ffdab9',
+ 'peru': 'cd853f',
+ 'pink': 'ffc0cb',
+ 'plum': 'dda0dd',
+ 'powderblue': 'b0e0e6',
+ 'purple': '800080',
+ 'rebeccapurple': '639',
+ 'red': 'f00',
+ 'rosybrown': 'bc8f8f',
+ 'royalblue': '4169e1',
+ 'saddlebrown': '8b4513',
+ 'salmon': 'fa8072',
+ 'sandybrown': 'f4a460',
+ 'seagreen': '2e8b57',
+ 'seashell': 'fff5ee',
+ 'sienna': 'a0522d',
+ 'silver': 'c0c0c0',
+ 'skyblue': '87ceeb',
+ 'slateblue': '6a5acd',
+ 'slategray': '708090',
+ 'slategrey': '708090',
+ 'snow': 'fffafa',
+ 'springgreen': '00ff7f',
+ 'steelblue': '4682b4',
+ 'tan': 'd2b48c',
+ 'teal': '008080',
+ 'thistle': 'd8bfd8',
+ 'tomato': 'ff6347',
+ 'turquoise': '40e0d0',
+ 'violet': 'ee82ee',
+ 'wheat': 'f5deb3',
+ 'white': 'fff',
+ 'whitesmoke': 'f5f5f5',
+ 'yellow': 'ff0',
+ 'yellowgreen': '9acd32'
+};
+
+var HEX_TO_NAME = {
+ '800000': 'maroon',
+ '800080': 'purple',
+ '808000': 'olive',
+ '808080': 'gray',
+ '00ffff': 'cyan',
+ 'f0ffff': 'azure',
+ 'f5f5dc': 'beige',
+ 'ffe4c4': 'bisque',
+ '000000': 'black',
+ '0000ff': 'blue',
+ 'a52a2a': 'brown',
+ 'ff7f50': 'coral',
+ 'ffd700': 'gold',
+ '008000': 'green',
+ '4b0082': 'indigo',
+ 'fffff0': 'ivory',
+ 'f0e68c': 'khaki',
+ '00ff00': 'lime',
+ 'faf0e6': 'linen',
+ '000080': 'navy',
+ 'ffa500': 'orange',
+ 'da70d6': 'orchid',
+ 'cd853f': 'peru',
+ 'ffc0cb': 'pink',
+ 'dda0dd': 'plum',
+ 'f00': 'red',
+ 'ff0000': 'red',
+ 'fa8072': 'salmon',
+ 'a0522d': 'sienna',
+ 'c0c0c0': 'silver',
+ 'fffafa': 'snow',
+ 'd2b48c': 'tan',
+ '008080': 'teal',
+ 'ff6347': 'tomato',
+ 'ee82ee': 'violet',
+ 'f5deb3': 'wheat',
+ 'ffffff': 'white',
+ 'ffff00': 'yellow'
+};
+
+function hueToRgb(p, q, t) {
+ if (t < 0) {
+ t += 1;
+ }
+ if (t > 1) {
+ t -= 1;
+ }
+ if (t < 1 / 6) {
+ return p + (q - p) * 6 * t;
+ }
+ if (t < 1 / 2) {
+ return q;
+ }
+ if (t < 2 / 3) {
+ return p + (q - p) * (2 / 3 - t) * 6;
+ }
+ return p;
+}
+
+function hslToRgb(h, s, l, a) {
+ var r;
+ var g;
+ var b;
+
+ if (s === 0) {
+ r = g = b = l; // achromatic
+ } else {
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ var p = 2 * l - q;
+
+ r = hueToRgb(p, q, h + 1 / 3);
+ g = hueToRgb(p, q, h);
+ b = hueToRgb(p, q, h - 1 / 3);
+ }
+
+ return [
+ Math.round(r * 255),
+ Math.round(g * 255),
+ Math.round(b * 255),
+ a
+ ];
+}
+
+function toHex(value) {
+ value = value.toString(16);
+ return value.length === 1 ? '0' + value : value;
+}
+
+function parseFunctionArgs(functionArgs, count, rgb) {
+ var cursor = functionArgs.head;
+ var args = [];
+ var wasValue = false;
+
+ while (cursor !== null) {
+ var node = cursor.data;
+ var type = node.type;
+
+ switch (type) {
+ case 'Number':
+ case 'Percentage':
+ if (wasValue) {
+ return;
+ }
+
+ wasValue = true;
+ args.push({
+ type: type,
+ value: Number(node.value)
+ });
+ break;
+
+ case 'Operator':
+ if (node.value === ',') {
+ if (!wasValue) {
+ return;
+ }
+ wasValue = false;
+ } else if (wasValue || node.value !== '+') {
+ return;
+ }
+ break;
+
+ default:
+ // something we couldn't understand
+ return;
+ }
+
+ cursor = cursor.next;
+ }
+
+ if (args.length !== count) {
+ // invalid arguments count
+ // TODO: remove those tokens
+ return;
+ }
+
+ if (args.length === 4) {
+ if (args[3].type !== 'Number') {
+ // 4th argument should be a number
+ // TODO: remove those tokens
+ return;
+ }
+
+ args[3].type = 'Alpha';
+ }
+
+ if (rgb) {
+ if (args[0].type !== args[1].type || args[0].type !== args[2].type) {
+ // invalid color, numbers and percentage shouldn't be mixed
+ // TODO: remove those tokens
+ return;
+ }
+ } else {
+ if (args[0].type !== 'Number' ||
+ args[1].type !== 'Percentage' ||
+ args[2].type !== 'Percentage') {
+ // invalid color, for hsl values should be: number, percentage, percentage
+ // TODO: remove those tokens
+ return;
+ }
+
+ args[0].type = 'Angle';
+ }
+
+ return args.map(function(arg) {
+ var value = Math.max(0, arg.value);
+
+ switch (arg.type) {
+ case 'Number':
+ // fit value to [0..255] range
+ value = Math.min(value, 255);
+ break;
+
+ case 'Percentage':
+ // convert 0..100% to value in [0..255] range
+ value = Math.min(value, 100) / 100;
+
+ if (!rgb) {
+ return value;
+ }
+
+ value = 255 * value;
+ break;
+
+ case 'Angle':
+ // fit value to (-360..360) range
+ return (((value % 360) + 360) % 360) / 360;
+
+ case 'Alpha':
+ // fit value to [0..1] range
+ return Math.min(value, 1);
+ }
+
+ return Math.round(value);
+ });
+}
+
+function compressFunction(node, item, list) {
+ var functionName = node.name;
+ var args;
+
+ if (functionName === 'rgba' || functionName === 'hsla') {
+ args = parseFunctionArgs(node.children, 4, functionName === 'rgba');
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ if (functionName === 'hsla') {
+ args = hslToRgb.apply(null, args);
+ node.name = 'rgba';
+ }
+
+ if (args[3] === 0) {
+ // try to replace `rgba(x, x, x, 0)` to `transparent`
+ // always replace `rgba(0, 0, 0, 0)` to `transparent`
+ // otherwise avoid replacement in gradients since it may break color transition
+ // http://stackoverflow.com/questions/11829410/css3-gradient-rendering-issues-from-transparent-to-white
+ var scopeFunctionName = this.function && this.function.name;
+ if ((args[0] === 0 && args[1] === 0 && args[2] === 0) ||
+ !/^(?:to|from|color-stop)$|gradient$/i.test(scopeFunctionName)) {
+
+ item.data = {
+ type: 'Identifier',
+ loc: node.loc,
+ name: 'transparent'
+ };
+
+ return;
+ }
+ }
+
+ if (args[3] !== 1) {
+ // replace argument values for normalized/interpolated
+ node.children.each(function(node, item, list) {
+ if (node.type === 'Operator') {
+ if (node.value !== ',') {
+ list.remove(item);
+ }
+ return;
+ }
+
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: packNumber(args.shift(), null)
+ };
+ });
+
+ return;
+ }
+
+ // otherwise convert to rgb, i.e. rgba(255, 0, 0, 1) -> rgb(255, 0, 0)
+ functionName = 'rgb';
+ }
+
+ if (functionName === 'hsl') {
+ args = args || parseFunctionArgs(node.children, 3, false);
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ // convert to rgb
+ args = hslToRgb.apply(null, args);
+ functionName = 'rgb';
+ }
+
+ if (functionName === 'rgb') {
+ args = args || parseFunctionArgs(node.children, 3, true);
+
+ if (!args) {
+ // something went wrong
+ return;
+ }
+
+ // check if color is not at the end and not followed by space
+ var next = item.next;
+ if (next && next.data.type !== 'WhiteSpace') {
+ list.insert(list.createItem({
+ type: 'WhiteSpace',
+ value: ' '
+ }), next);
+ }
+
+ item.data = {
+ type: 'Hash',
+ loc: node.loc,
+ value: toHex(args[0]) + toHex(args[1]) + toHex(args[2])
+ };
+
+ compressHex(item.data, item);
+ }
+}
+
+function compressIdent(node, item) {
+ if (this.declaration === null) {
+ return;
+ }
+
+ var color = node.name.toLowerCase();
+
+ if (NAME_TO_HEX.hasOwnProperty(color) &&
+ lexer.matchDeclaration(this.declaration).isType(node, 'color')) {
+ var hex = NAME_TO_HEX[color];
+
+ if (hex.length + 1 <= color.length) {
+ // replace for shorter hex value
+ item.data = {
+ type: 'Hash',
+ loc: node.loc,
+ value: hex
+ };
+ } else {
+ // special case for consistent colors
+ if (color === 'grey') {
+ color = 'gray';
+ }
+
+ // just replace value for lower cased name
+ node.name = color;
+ }
+ }
+}
+
+function compressHex(node, item) {
+ var color = node.value.toLowerCase();
+
+ // #112233 -> #123
+ if (color.length === 6 &&
+ color[0] === color[1] &&
+ color[2] === color[3] &&
+ color[4] === color[5]) {
+ color = color[0] + color[2] + color[4];
+ }
+
+ if (HEX_TO_NAME[color]) {
+ item.data = {
+ type: 'Identifier',
+ loc: node.loc,
+ name: HEX_TO_NAME[color]
+ };
+ } else {
+ node.value = color;
+ }
+}
+
+module.exports = {
+ compressFunction: compressFunction,
+ compressIdent: compressIdent,
+ compressHex: compressHex
+};
diff --git a/node_modules/csso/lib/replace/index.js b/node_modules/csso/lib/replace/index.js
new file mode 100644
index 0000000..2e2c5f6
--- /dev/null
+++ b/node_modules/csso/lib/replace/index.js
@@ -0,0 +1,24 @@
+var walk = require('css-tree').walk;
+var handlers = {
+ Atrule: require('./Atrule'),
+ AttributeSelector: require('./AttributeSelector'),
+ Value: require('./Value'),
+ Dimension: require('./Dimension'),
+ Percentage: require('./Percentage'),
+ Number: require('./Number'),
+ String: require('./String'),
+ Url: require('./Url'),
+ Hash: require('./color').compressHex,
+ Identifier: require('./color').compressIdent,
+ Function: require('./color').compressFunction
+};
+
+module.exports = function(ast) {
+ walk(ast, {
+ leave: function(node, item, list) {
+ if (handlers.hasOwnProperty(node.type)) {
+ handlers[node.type].call(this, node, item, list);
+ }
+ }
+ });
+};
diff --git a/node_modules/csso/lib/replace/property/background.js b/node_modules/csso/lib/replace/property/background.js
new file mode 100644
index 0000000..a17ed4f
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/background.js
@@ -0,0 +1,69 @@
+var List = require('css-tree').List;
+
+module.exports = function compressBackground(node) {
+ function lastType() {
+ if (buffer.length) {
+ return buffer[buffer.length - 1].type;
+ }
+ }
+
+ function flush() {
+ if (lastType() === 'WhiteSpace') {
+ buffer.pop();
+ }
+
+ if (!buffer.length) {
+ buffer.unshift(
+ {
+ type: 'Number',
+ loc: null,
+ value: '0'
+ },
+ {
+ type: 'WhiteSpace',
+ value: ' '
+ },
+ {
+ type: 'Number',
+ loc: null,
+ value: '0'
+ }
+ );
+ }
+
+ newValue.push.apply(newValue, buffer);
+
+ buffer = [];
+ }
+
+ var newValue = [];
+ var buffer = [];
+
+ node.children.each(function(node) {
+ if (node.type === 'Operator' && node.value === ',') {
+ flush();
+ newValue.push(node);
+ return;
+ }
+
+ // remove defaults
+ if (node.type === 'Identifier') {
+ if (node.name === 'transparent' ||
+ node.name === 'none' ||
+ node.name === 'repeat' ||
+ node.name === 'scroll') {
+ return;
+ }
+ }
+
+ // don't add redundant spaces
+ if (node.type === 'WhiteSpace' && (!buffer.length || lastType() === 'WhiteSpace')) {
+ return;
+ }
+
+ buffer.push(node);
+ });
+
+ flush();
+ node.children = new List().fromArray(newValue);
+};
diff --git a/node_modules/csso/lib/replace/property/border.js b/node_modules/csso/lib/replace/property/border.js
new file mode 100644
index 0000000..09a32c3
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/border.js
@@ -0,0 +1,31 @@
+function removeItemAndRedundantWhiteSpace(list, item) {
+ var prev = item.prev;
+ var next = item.next;
+
+ if (next !== null) {
+ if (next.data.type === 'WhiteSpace' && (prev === null || prev.data.type === 'WhiteSpace')) {
+ list.remove(next);
+ }
+ } else if (prev !== null && prev.data.type === 'WhiteSpace') {
+ list.remove(prev);
+ }
+
+ list.remove(item);
+}
+
+module.exports = function compressBorder(node) {
+ node.children.each(function(node, item, list) {
+ if (node.type === 'Identifier' && node.name.toLowerCase() === 'none') {
+ if (list.head === list.tail) {
+ // replace `none` for zero when `none` is a single term
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: '0'
+ };
+ } else {
+ removeItemAndRedundantWhiteSpace(list, item);
+ }
+ }
+ });
+};
diff --git a/node_modules/csso/lib/replace/property/font-weight.js b/node_modules/csso/lib/replace/property/font-weight.js
new file mode 100644
index 0000000..6f2d34c
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/font-weight.js
@@ -0,0 +1,22 @@
+module.exports = function compressFontWeight(node) {
+ var value = node.children.head.data;
+
+ if (value.type === 'Identifier') {
+ switch (value.name) {
+ case 'normal':
+ node.children.head.data = {
+ type: 'Number',
+ loc: value.loc,
+ value: '400'
+ };
+ break;
+ case 'bold':
+ node.children.head.data = {
+ type: 'Number',
+ loc: value.loc,
+ value: '700'
+ };
+ break;
+ }
+ }
+};
diff --git a/node_modules/csso/lib/replace/property/font.js b/node_modules/csso/lib/replace/property/font.js
new file mode 100644
index 0000000..043ca5c
--- /dev/null
+++ b/node_modules/csso/lib/replace/property/font.js
@@ -0,0 +1,45 @@
+module.exports = function compressFont(node) {
+ var list = node.children;
+
+ list.eachRight(function(node, item) {
+ if (node.type === 'Identifier') {
+ if (node.name === 'bold') {
+ item.data = {
+ type: 'Number',
+ loc: node.loc,
+ value: '700'
+ };
+ } else if (node.name === 'normal') {
+ var prev = item.prev;
+
+ if (prev && prev.data.type === 'Operator' && prev.data.value === '/') {
+ this.remove(prev);
+ }
+
+ this.remove(item);
+ } else if (node.name === 'medium') {
+ var next = item.next;
+
+ if (!next || next.data.type !== 'Operator') {
+ this.remove(item);
+ }
+ }
+ }
+ });
+
+ // remove redundant spaces
+ list.each(function(node, item) {
+ if (node.type === 'WhiteSpace') {
+ if (!item.prev || !item.next || item.next.data.type === 'WhiteSpace') {
+ this.remove(item);
+ }
+ }
+ });
+
+ if (list.isEmpty()) {
+ list.insert(list.createItem({
+ type: 'Identifier',
+ name: 'normal'
+ }));
+ }
+};
diff --git a/node_modules/csso/lib/restructure/1-mergeAtrule.js b/node_modules/csso/lib/restructure/1-mergeAtrule.js
new file mode 100644
index 0000000..2239f69
--- /dev/null
+++ b/node_modules/csso/lib/restructure/1-mergeAtrule.js
@@ -0,0 +1,107 @@
+var List = require('css-tree').List;
+var resolveKeyword = require('css-tree').keyword;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var walk = require('css-tree').walk;
+
+function addRuleToMap(map, item, list, single) {
+ var node = item.data;
+ var name = resolveKeyword(node.name).basename;
+ var id = node.name.toLowerCase() + '/' + (node.prelude ? node.prelude.id : null);
+
+ if (!hasOwnProperty.call(map, name)) {
+ map[name] = Object.create(null);
+ }
+
+ if (single) {
+ delete map[name][id];
+ }
+
+ if (!hasOwnProperty.call(map[name], id)) {
+ map[name][id] = new List();
+ }
+
+ map[name][id].append(list.remove(item));
+}
+
+function relocateAtrules(ast, options) {
+ var collected = Object.create(null);
+ var topInjectPoint = null;
+
+ ast.children.each(function(node, item, list) {
+ if (node.type === 'Atrule') {
+ var name = resolveKeyword(node.name).basename;
+
+ switch (name) {
+ case 'keyframes':
+ addRuleToMap(collected, item, list, true);
+ return;
+
+ case 'media':
+ if (options.forceMediaMerge) {
+ addRuleToMap(collected, item, list, false);
+ return;
+ }
+ break;
+ }
+
+ if (topInjectPoint === null &&
+ name !== 'charset' &&
+ name !== 'import') {
+ topInjectPoint = item;
+ }
+ } else {
+ if (topInjectPoint === null) {
+ topInjectPoint = item;
+ }
+ }
+ });
+
+ for (var atrule in collected) {
+ for (var id in collected[atrule]) {
+ ast.children.insertList(
+ collected[atrule][id],
+ atrule === 'media' ? null : topInjectPoint
+ );
+ }
+ }
+};
+
+function isMediaRule(node) {
+ return node.type === 'Atrule' && node.name === 'media';
+}
+
+function processAtrule(node, item, list) {
+ if (!isMediaRule(node)) {
+ return;
+ }
+
+ var prev = item.prev && item.prev.data;
+
+ if (!prev || !isMediaRule(prev)) {
+ return;
+ }
+
+ // merge @media with same query
+ if (node.prelude &&
+ prev.prelude &&
+ node.prelude.id === prev.prelude.id) {
+ prev.block.children.appendList(node.block.children);
+ list.remove(item);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.loc = {
+ // primary: prev.loc,
+ // merged: node.loc
+ // };
+ }
+}
+
+module.exports = function rejoinAtrule(ast, options) {
+ relocateAtrules(ast, options);
+
+ walk(ast, {
+ visit: 'Atrule',
+ reverse: true,
+ enter: processAtrule
+ });
+};
diff --git a/node_modules/csso/lib/restructure/2-initialMergeRuleset.js b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js
new file mode 100644
index 0000000..9ed0718
--- /dev/null
+++ b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js
@@ -0,0 +1,47 @@
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+function processRule(node, item, list) {
+ var selectors = node.prelude.children;
+ var declarations = node.block.children;
+
+ list.prevUntil(item.prev, function(prev) {
+ // skip non-ruleset node if safe
+ if (prev.type !== 'Rule') {
+ return utils.unsafeToSkipNode.call(selectors, prev);
+ }
+
+ var prevSelectors = prev.prelude.children;
+ var prevDeclarations = prev.block.children;
+
+ // try to join rulesets with equal pseudo signature
+ if (node.pseudoSignature === prev.pseudoSignature) {
+ // try to join by selectors
+ if (utils.isEqualSelectors(prevSelectors, selectors)) {
+ prevDeclarations.appendList(declarations);
+ list.remove(item);
+ return true;
+ }
+
+ // try to join by declarations
+ if (utils.isEqualDeclarations(declarations, prevDeclarations)) {
+ utils.addSelectors(prevSelectors, selectors);
+ list.remove(item);
+ return true;
+ }
+ }
+
+ // go to prev ruleset if has no selector similarities
+ return utils.hasSimilarSelectors(selectors, prevSelectors);
+ });
+}
+
+// NOTE: direction should be left to right, since rulesets merge to left
+// ruleset. When direction right to left unmerged rulesets may prevent lookup
+// TODO: remove initial merge
+module.exports = function initialMergeRule(ast) {
+ walk(ast, {
+ visit: 'Rule',
+ enter: processRule
+ });
+};
diff --git a/node_modules/csso/lib/restructure/3-disjoinRuleset.js b/node_modules/csso/lib/restructure/3-disjoinRuleset.js
new file mode 100644
index 0000000..0c56964
--- /dev/null
+++ b/node_modules/csso/lib/restructure/3-disjoinRuleset.js
@@ -0,0 +1,42 @@
+var List = require('css-tree').List;
+var walk = require('css-tree').walk;
+
+function processRule(node, item, list) {
+ var selectors = node.prelude.children;
+
+ // generate new rule sets:
+ // .a, .b { color: red; }
+ // ->
+ // .a { color: red; }
+ // .b { color: red; }
+
+ // while there are more than 1 simple selector split for rulesets
+ while (selectors.head !== selectors.tail) {
+ var newSelectors = new List();
+ newSelectors.insert(selectors.remove(selectors.head));
+
+ list.insert(list.createItem({
+ type: 'Rule',
+ loc: node.loc,
+ prelude: {
+ type: 'SelectorList',
+ loc: node.prelude.loc,
+ children: newSelectors
+ },
+ block: {
+ type: 'Block',
+ loc: node.block.loc,
+ children: node.block.children.copy()
+ },
+ pseudoSignature: node.pseudoSignature
+ }), item);
+ }
+}
+
+module.exports = function disjoinRule(ast) {
+ walk(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: processRule
+ });
+};
diff --git a/node_modules/csso/lib/restructure/4-restructShorthand.js b/node_modules/csso/lib/restructure/4-restructShorthand.js
new file mode 100644
index 0000000..f95889e
--- /dev/null
+++ b/node_modules/csso/lib/restructure/4-restructShorthand.js
@@ -0,0 +1,432 @@
+var List = require('css-tree').List;
+var generate = require('css-tree').generate;
+var walk = require('css-tree').walk;
+
+var REPLACE = 1;
+var REMOVE = 2;
+var TOP = 0;
+var RIGHT = 1;
+var BOTTOM = 2;
+var LEFT = 3;
+var SIDES = ['top', 'right', 'bottom', 'left'];
+var SIDE = {
+ 'margin-top': 'top',
+ 'margin-right': 'right',
+ 'margin-bottom': 'bottom',
+ 'margin-left': 'left',
+
+ 'padding-top': 'top',
+ 'padding-right': 'right',
+ 'padding-bottom': 'bottom',
+ 'padding-left': 'left',
+
+ 'border-top-color': 'top',
+ 'border-right-color': 'right',
+ 'border-bottom-color': 'bottom',
+ 'border-left-color': 'left',
+ 'border-top-width': 'top',
+ 'border-right-width': 'right',
+ 'border-bottom-width': 'bottom',
+ 'border-left-width': 'left',
+ 'border-top-style': 'top',
+ 'border-right-style': 'right',
+ 'border-bottom-style': 'bottom',
+ 'border-left-style': 'left'
+};
+var MAIN_PROPERTY = {
+ 'margin': 'margin',
+ 'margin-top': 'margin',
+ 'margin-right': 'margin',
+ 'margin-bottom': 'margin',
+ 'margin-left': 'margin',
+
+ 'padding': 'padding',
+ 'padding-top': 'padding',
+ 'padding-right': 'padding',
+ 'padding-bottom': 'padding',
+ 'padding-left': 'padding',
+
+ 'border-color': 'border-color',
+ 'border-top-color': 'border-color',
+ 'border-right-color': 'border-color',
+ 'border-bottom-color': 'border-color',
+ 'border-left-color': 'border-color',
+ 'border-width': 'border-width',
+ 'border-top-width': 'border-width',
+ 'border-right-width': 'border-width',
+ 'border-bottom-width': 'border-width',
+ 'border-left-width': 'border-width',
+ 'border-style': 'border-style',
+ 'border-top-style': 'border-style',
+ 'border-right-style': 'border-style',
+ 'border-bottom-style': 'border-style',
+ 'border-left-style': 'border-style'
+};
+
+function TRBL(name) {
+ this.name = name;
+ this.loc = null;
+ this.iehack = undefined;
+ this.sides = {
+ 'top': null,
+ 'right': null,
+ 'bottom': null,
+ 'left': null
+ };
+}
+
+TRBL.prototype.getValueSequence = function(declaration, count) {
+ var values = [];
+ var iehack = '';
+ var hasBadValues = declaration.value.type !== 'Value' || declaration.value.children.some(function(child) {
+ var special = false;
+
+ switch (child.type) {
+ case 'Identifier':
+ switch (child.name) {
+ case '\\0':
+ case '\\9':
+ iehack = child.name;
+ return;
+
+ case 'inherit':
+ case 'initial':
+ case 'unset':
+ case 'revert':
+ special = child.name;
+ break;
+ }
+ break;
+
+ case 'Dimension':
+ switch (child.unit) {
+ // is not supported until IE11
+ case 'rem':
+
+ // v* units is too buggy across browsers and better
+ // don't merge values with those units
+ case 'vw':
+ case 'vh':
+ case 'vmin':
+ case 'vmax':
+ case 'vm': // IE9 supporting "vm" instead of "vmin".
+ special = child.unit;
+ break;
+ }
+ break;
+
+ case 'Hash': // color
+ case 'Number':
+ case 'Percentage':
+ break;
+
+ case 'Function':
+ if (child.name === 'var') {
+ return true;
+ }
+
+ special = child.name;
+ break;
+
+ case 'WhiteSpace':
+ return false; // ignore space
+
+ default:
+ return true; // bad value
+ }
+
+ values.push({
+ node: child,
+ special: special,
+ important: declaration.important
+ });
+ });
+
+ if (hasBadValues || values.length > count) {
+ return false;
+ }
+
+ if (typeof this.iehack === 'string' && this.iehack !== iehack) {
+ return false;
+ }
+
+ this.iehack = iehack; // move outside
+
+ return values;
+};
+
+TRBL.prototype.canOverride = function(side, value) {
+ var currentValue = this.sides[side];
+
+ return !currentValue || (value.important && !currentValue.important);
+};
+
+TRBL.prototype.add = function(name, declaration) {
+ function attemptToAdd() {
+ var sides = this.sides;
+ var side = SIDE[name];
+
+ if (side) {
+ if (side in sides === false) {
+ return false;
+ }
+
+ var values = this.getValueSequence(declaration, 1);
+
+ if (!values || !values.length) {
+ return false;
+ }
+
+ // can mix only if specials are equal
+ for (var key in sides) {
+ if (sides[key] !== null && sides[key].special !== values[0].special) {
+ return false;
+ }
+ }
+
+ if (!this.canOverride(side, values[0])) {
+ return true;
+ }
+
+ sides[side] = values[0];
+ return true;
+ } else if (name === this.name) {
+ var values = this.getValueSequence(declaration, 4);
+
+ if (!values || !values.length) {
+ return false;
+ }
+
+ switch (values.length) {
+ case 1:
+ values[RIGHT] = values[TOP];
+ values[BOTTOM] = values[TOP];
+ values[LEFT] = values[TOP];
+ break;
+
+ case 2:
+ values[BOTTOM] = values[TOP];
+ values[LEFT] = values[RIGHT];
+ break;
+
+ case 3:
+ values[LEFT] = values[RIGHT];
+ break;
+ }
+
+ // can mix only if specials are equal
+ for (var i = 0; i < 4; i++) {
+ for (var key in sides) {
+ if (sides[key] !== null && sides[key].special !== values[i].special) {
+ return false;
+ }
+ }
+ }
+
+ for (var i = 0; i < 4; i++) {
+ if (this.canOverride(SIDES[i], values[i])) {
+ sides[SIDES[i]] = values[i];
+ }
+ }
+
+ return true;
+ }
+ }
+
+ if (!attemptToAdd.call(this)) {
+ return false;
+ }
+
+ // TODO: use it when we can refer to several points in source
+ // if (this.loc) {
+ // this.loc = {
+ // primary: this.loc,
+ // merged: declaration.loc
+ // };
+ // } else {
+ // this.loc = declaration.loc;
+ // }
+ if (!this.loc) {
+ this.loc = declaration.loc;
+ }
+
+ return true;
+};
+
+TRBL.prototype.isOkToMinimize = function() {
+ var top = this.sides.top;
+ var right = this.sides.right;
+ var bottom = this.sides.bottom;
+ var left = this.sides.left;
+
+ if (top && right && bottom && left) {
+ var important =
+ top.important +
+ right.important +
+ bottom.important +
+ left.important;
+
+ return important === 0 || important === 4;
+ }
+
+ return false;
+};
+
+TRBL.prototype.getValue = function() {
+ var result = new List();
+ var sides = this.sides;
+ var values = [
+ sides.top,
+ sides.right,
+ sides.bottom,
+ sides.left
+ ];
+ var stringValues = [
+ generate(sides.top.node),
+ generate(sides.right.node),
+ generate(sides.bottom.node),
+ generate(sides.left.node)
+ ];
+
+ if (stringValues[LEFT] === stringValues[RIGHT]) {
+ values.pop();
+ if (stringValues[BOTTOM] === stringValues[TOP]) {
+ values.pop();
+ if (stringValues[RIGHT] === stringValues[TOP]) {
+ values.pop();
+ }
+ }
+ }
+
+ for (var i = 0; i < values.length; i++) {
+ if (i) {
+ result.appendData({ type: 'WhiteSpace', value: ' ' });
+ }
+
+ result.appendData(values[i].node);
+ }
+
+ if (this.iehack) {
+ result.appendData({ type: 'WhiteSpace', value: ' ' });
+ result.appendData({
+ type: 'Identifier',
+ loc: null,
+ name: this.iehack
+ });
+ }
+
+ return {
+ type: 'Value',
+ loc: null,
+ children: result
+ };
+};
+
+TRBL.prototype.getDeclaration = function() {
+ return {
+ type: 'Declaration',
+ loc: this.loc,
+ important: this.sides.top.important,
+ property: this.name,
+ value: this.getValue()
+ };
+};
+
+function processRule(rule, shorts, shortDeclarations, lastShortSelector) {
+ var declarations = rule.block.children;
+ var selector = rule.prelude.children.first().id;
+
+ rule.block.children.eachRight(function(declaration, item) {
+ var property = declaration.property;
+
+ if (!MAIN_PROPERTY.hasOwnProperty(property)) {
+ return;
+ }
+
+ var key = MAIN_PROPERTY[property];
+ var shorthand;
+ var operation;
+
+ if (!lastShortSelector || selector === lastShortSelector) {
+ if (key in shorts) {
+ operation = REMOVE;
+ shorthand = shorts[key];
+ }
+ }
+
+ if (!shorthand || !shorthand.add(property, declaration)) {
+ operation = REPLACE;
+ shorthand = new TRBL(key);
+
+ // if can't parse value ignore it and break shorthand children
+ if (!shorthand.add(property, declaration)) {
+ lastShortSelector = null;
+ return;
+ }
+ }
+
+ shorts[key] = shorthand;
+ shortDeclarations.push({
+ operation: operation,
+ block: declarations,
+ item: item,
+ shorthand: shorthand
+ });
+
+ lastShortSelector = selector;
+ });
+
+ return lastShortSelector;
+}
+
+function processShorthands(shortDeclarations, markDeclaration) {
+ shortDeclarations.forEach(function(item) {
+ var shorthand = item.shorthand;
+
+ if (!shorthand.isOkToMinimize()) {
+ return;
+ }
+
+ if (item.operation === REPLACE) {
+ item.item.data = markDeclaration(shorthand.getDeclaration());
+ } else {
+ item.block.remove(item.item);
+ }
+ });
+}
+
+module.exports = function restructBlock(ast, indexer) {
+ var stylesheetMap = {};
+ var shortDeclarations = [];
+
+ walk(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: function(node) {
+ var stylesheet = this.block || this.stylesheet;
+ var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+ var ruleMap;
+ var shorts;
+
+ if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+ ruleMap = {
+ lastShortSelector: null
+ };
+ stylesheetMap[stylesheet.id] = ruleMap;
+ } else {
+ ruleMap = stylesheetMap[stylesheet.id];
+ }
+
+ if (ruleMap.hasOwnProperty(ruleId)) {
+ shorts = ruleMap[ruleId];
+ } else {
+ shorts = {};
+ ruleMap[ruleId] = shorts;
+ }
+
+ ruleMap.lastShortSelector = processRule.call(this, node, shorts, shortDeclarations, ruleMap.lastShortSelector);
+ }
+ });
+
+ processShorthands(shortDeclarations, indexer.declaration);
+};
diff --git a/node_modules/csso/lib/restructure/6-restructBlock.js b/node_modules/csso/lib/restructure/6-restructBlock.js
new file mode 100644
index 0000000..3864516
--- /dev/null
+++ b/node_modules/csso/lib/restructure/6-restructBlock.js
@@ -0,0 +1,300 @@
+var resolveProperty = require('css-tree').property;
+var resolveKeyword = require('css-tree').keyword;
+var walk = require('css-tree').walk;
+var generate = require('css-tree').generate;
+var fingerprintId = 1;
+var dontRestructure = {
+ 'src': 1 // https://github.com/afelix/csso/issues/50
+};
+
+var DONT_MIX_VALUE = {
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/display#Browser_compatibility
+ 'display': /table|ruby|flex|-(flex)?box$|grid|contents|run-in/i,
+ // https://developer.mozilla.org/en/docs/Web/CSS/text-align
+ 'text-align': /^(start|end|match-parent|justify-all)$/i
+};
+
+var SAFE_VALUES = {
+ cursor: [
+ 'auto', 'crosshair', 'default', 'move', 'text', 'wait', 'help',
+ 'n-resize', 'e-resize', 's-resize', 'w-resize',
+ 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize',
+ 'pointer', 'progress', 'not-allowed', 'no-drop', 'vertical-text', 'all-scroll',
+ 'col-resize', 'row-resize'
+ ],
+ overflow: [
+ 'hidden', 'visible', 'scroll', 'auto'
+ ],
+ position: [
+ 'static', 'relative', 'absolute', 'fixed'
+ ]
+};
+
+var NEEDLESS_TABLE = {
+ 'border-width': ['border'],
+ 'border-style': ['border'],
+ 'border-color': ['border'],
+ 'border-top': ['border'],
+ 'border-right': ['border'],
+ 'border-bottom': ['border'],
+ 'border-left': ['border'],
+ 'border-top-width': ['border-top', 'border-width', 'border'],
+ 'border-right-width': ['border-right', 'border-width', 'border'],
+ 'border-bottom-width': ['border-bottom', 'border-width', 'border'],
+ 'border-left-width': ['border-left', 'border-width', 'border'],
+ 'border-top-style': ['border-top', 'border-style', 'border'],
+ 'border-right-style': ['border-right', 'border-style', 'border'],
+ 'border-bottom-style': ['border-bottom', 'border-style', 'border'],
+ 'border-left-style': ['border-left', 'border-style', 'border'],
+ 'border-top-color': ['border-top', 'border-color', 'border'],
+ 'border-right-color': ['border-right', 'border-color', 'border'],
+ 'border-bottom-color': ['border-bottom', 'border-color', 'border'],
+ 'border-left-color': ['border-left', 'border-color', 'border'],
+ 'margin-top': ['margin'],
+ 'margin-right': ['margin'],
+ 'margin-bottom': ['margin'],
+ 'margin-left': ['margin'],
+ 'padding-top': ['padding'],
+ 'padding-right': ['padding'],
+ 'padding-bottom': ['padding'],
+ 'padding-left': ['padding'],
+ 'font-style': ['font'],
+ 'font-variant': ['font'],
+ 'font-weight': ['font'],
+ 'font-size': ['font'],
+ 'font-family': ['font'],
+ 'list-style-type': ['list-style'],
+ 'list-style-position': ['list-style'],
+ 'list-style-image': ['list-style']
+};
+
+function getPropertyFingerprint(propertyName, declaration, fingerprints) {
+ var realName = resolveProperty(propertyName).basename;
+
+ if (realName === 'background') {
+ return propertyName + ':' + generate(declaration.value);
+ }
+
+ var declarationId = declaration.id;
+ var fingerprint = fingerprints[declarationId];
+
+ if (!fingerprint) {
+ switch (declaration.value.type) {
+ case 'Value':
+ var vendorId = '';
+ var iehack = '';
+ var special = {};
+ var raw = false;
+
+ declaration.value.children.each(function walk(node) {
+ switch (node.type) {
+ case 'Value':
+ case 'Brackets':
+ case 'Parentheses':
+ node.children.each(walk);
+ break;
+
+ case 'Raw':
+ raw = true;
+ break;
+
+ case 'Identifier':
+ var name = node.name;
+
+ if (!vendorId) {
+ vendorId = resolveKeyword(name).vendor;
+ }
+
+ if (/\\[09]/.test(name)) {
+ iehack = RegExp.lastMatch;
+ }
+
+ if (SAFE_VALUES.hasOwnProperty(realName)) {
+ if (SAFE_VALUES[realName].indexOf(name) === -1) {
+ special[name] = true;
+ }
+ } else if (DONT_MIX_VALUE.hasOwnProperty(realName)) {
+ if (DONT_MIX_VALUE[realName].test(name)) {
+ special[name] = true;
+ }
+ }
+
+ break;
+
+ case 'Function':
+ var name = node.name;
+
+ if (!vendorId) {
+ vendorId = resolveKeyword(name).vendor;
+ }
+
+ if (name === 'rect') {
+ // there are 2 forms of rect:
+ // rect(<top>, <right>, <bottom>, <left>) - standart
+ // rect(<top> <right> <bottom> <left>) – backwards compatible syntax
+ // only the same form values can be merged
+ var hasComma = node.children.some(function(node) {
+ return node.type === 'Operator' && node.value === ',';
+ });
+ if (!hasComma) {
+ name = 'rect-backward';
+ }
+ }
+
+ special[name + '()'] = true;
+
+ // check nested tokens too
+ node.children.each(walk);
+
+ break;
+
+ case 'Dimension':
+ var unit = node.unit;
+
+ if (/\\[09]/.test(unit)) {
+ iehack = RegExp.lastMatch;
+ }
+
+ switch (unit) {
+ // is not supported until IE11
+ case 'rem':
+
+ // v* units is too buggy across browsers and better
+ // don't merge values with those units
+ case 'vw':
+ case 'vh':
+ case 'vmin':
+ case 'vmax':
+ case 'vm': // IE9 supporting "vm" instead of "vmin".
+ special[unit] = true;
+ break;
+ }
+ break;
+ }
+ });
+
+ fingerprint = raw
+ ? '!' + fingerprintId++
+ : '!' + Object.keys(special).sort() + '|' + iehack + vendorId;
+ break;
+
+ case 'Raw':
+ fingerprint = '!' + declaration.value.value;
+ break;
+
+ default:
+ fingerprint = generate(declaration.value);
+ }
+
+ fingerprints[declarationId] = fingerprint;
+ }
+
+ return propertyName + fingerprint;
+}
+
+function needless(props, declaration, fingerprints) {
+ var property = resolveProperty(declaration.property);
+
+ if (NEEDLESS_TABLE.hasOwnProperty(property.basename)) {
+ var table = NEEDLESS_TABLE[property.basename];
+
+ for (var i = 0; i < table.length; i++) {
+ var ppre = getPropertyFingerprint(property.prefix + table[i], declaration, fingerprints);
+ var prev = props.hasOwnProperty(ppre) ? props[ppre] : null;
+
+ if (prev && (!declaration.important || prev.item.data.important)) {
+ return prev;
+ }
+ }
+ }
+}
+
+function processRule(rule, item, list, props, fingerprints) {
+ var declarations = rule.block.children;
+
+ declarations.eachRight(function(declaration, declarationItem) {
+ var property = declaration.property;
+ var fingerprint = getPropertyFingerprint(property, declaration, fingerprints);
+ var prev = props[fingerprint];
+
+ if (prev && !dontRestructure.hasOwnProperty(property)) {
+ if (declaration.important && !prev.item.data.important) {
+ props[fingerprint] = {
+ block: declarations,
+ item: declarationItem
+ };
+
+ prev.block.remove(prev.item);
+
+ // TODO: use it when we can refer to several points in source
+ // declaration.loc = {
+ // primary: declaration.loc,
+ // merged: prev.item.data.loc
+ // };
+ } else {
+ declarations.remove(declarationItem);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.item.data.loc = {
+ // primary: prev.item.data.loc,
+ // merged: declaration.loc
+ // };
+ }
+ } else {
+ var prev = needless(props, declaration, fingerprints);
+
+ if (prev) {
+ declarations.remove(declarationItem);
+
+ // TODO: use it when we can refer to several points in source
+ // prev.item.data.loc = {
+ // primary: prev.item.data.loc,
+ // merged: declaration.loc
+ // };
+ } else {
+ declaration.fingerprint = fingerprint;
+
+ props[fingerprint] = {
+ block: declarations,
+ item: declarationItem
+ };
+ }
+ }
+ });
+
+ if (declarations.isEmpty()) {
+ list.remove(item);
+ }
+}
+
+module.exports = function restructBlock(ast) {
+ var stylesheetMap = {};
+ var fingerprints = Object.create(null);
+
+ walk(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: function(node, item, list) {
+ var stylesheet = this.block || this.stylesheet;
+ var ruleId = (node.pseudoSignature || '') + '|' + node.prelude.children.first().id;
+ var ruleMap;
+ var props;
+
+ if (!stylesheetMap.hasOwnProperty(stylesheet.id)) {
+ ruleMap = {};
+ stylesheetMap[stylesheet.id] = ruleMap;
+ } else {
+ ruleMap = stylesheetMap[stylesheet.id];
+ }
+
+ if (ruleMap.hasOwnProperty(ruleId)) {
+ props = ruleMap[ruleId];
+ } else {
+ props = {};
+ ruleMap[ruleId] = props;
+ }
+
+ processRule.call(this, node, item, list, props, fingerprints);
+ }
+ });
+};
diff --git a/node_modules/csso/lib/restructure/7-mergeRuleset.js b/node_modules/csso/lib/restructure/7-mergeRuleset.js
new file mode 100644
index 0000000..575e959
--- /dev/null
+++ b/node_modules/csso/lib/restructure/7-mergeRuleset.js
@@ -0,0 +1,86 @@
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+/*
+ At this step all rules has single simple selector. We try to join by equal
+ declaration blocks to first rule, e.g.
+
+ .a { color: red }
+ b { ... }
+ .b { color: red }
+ ->
+ .a, .b { color: red }
+ b { ... }
+*/
+
+function processRule(node, item, list) {
+ var selectors = node.prelude.children;
+ var declarations = node.block.children;
+ var nodeCompareMarker = selectors.first().compareMarker;
+ var skippedCompareMarkers = {};
+
+ list.nextUntil(item.next, function(next, nextItem) {
+ // skip non-ruleset node if safe
+ if (next.type !== 'Rule') {
+ return utils.unsafeToSkipNode.call(selectors, next);
+ }
+
+ if (node.pseudoSignature !== next.pseudoSignature) {
+ return true;
+ }
+
+ var nextFirstSelector = next.prelude.children.head;
+ var nextDeclarations = next.block.children;
+ var nextCompareMarker = nextFirstSelector.data.compareMarker;
+
+ // if next ruleset has same marked as one of skipped then stop joining
+ if (nextCompareMarker in skippedCompareMarkers) {
+ return true;
+ }
+
+ // try to join by selectors
+ if (selectors.head === selectors.tail) {
+ if (selectors.first().id === nextFirstSelector.data.id) {
+ declarations.appendList(nextDeclarations);
+ list.remove(nextItem);
+ return;
+ }
+ }
+
+ // try to join by properties
+ if (utils.isEqualDeclarations(declarations, nextDeclarations)) {
+ var nextStr = nextFirstSelector.data.id;
+
+ selectors.some(function(data, item) {
+ var curStr = data.id;
+
+ if (nextStr < curStr) {
+ selectors.insert(nextFirstSelector, item);
+ return true;
+ }
+
+ if (!item.next) {
+ selectors.insert(nextFirstSelector);
+ return true;
+ }
+ });
+
+ list.remove(nextItem);
+ return;
+ }
+
+ // go to next ruleset if current one can be skipped (has no equal specificity nor element selector)
+ if (nextCompareMarker === nodeCompareMarker) {
+ return true;
+ }
+
+ skippedCompareMarkers[nextCompareMarker] = true;
+ });
+}
+
+module.exports = function mergeRule(ast) {
+ walk(ast, {
+ visit: 'Rule',
+ enter: processRule
+ });
+};
diff --git a/node_modules/csso/lib/restructure/8-restructRuleset.js b/node_modules/csso/lib/restructure/8-restructRuleset.js
new file mode 100644
index 0000000..111ae98
--- /dev/null
+++ b/node_modules/csso/lib/restructure/8-restructRuleset.js
@@ -0,0 +1,177 @@
+var List = require('css-tree').List;
+var walk = require('css-tree').walk;
+var utils = require('./utils');
+
+function calcSelectorLength(list) {
+ var length = 0;
+
+ list.each(function(data) {
+ length += data.id.length + 1;
+ });
+
+ return length - 1;
+}
+
+function calcDeclarationsLength(tokens) {
+ var length = 0;
+
+ for (var i = 0; i < tokens.length; i++) {
+ length += tokens[i].length;
+ }
+
+ return (
+ length + // declarations
+ tokens.length - 1 // delimeters
+ );
+}
+
+function processRule(node, item, list) {
+ var avoidRulesMerge = this.block !== null ? this.block.avoidRulesMerge : false;
+ var selectors = node.prelude.children;
+ var block = node.block;
+ var disallowDownMarkers = Object.create(null);
+ var allowMergeUp = true;
+ var allowMergeDown = true;
+
+ list.prevUntil(item.prev, function(prev, prevItem) {
+ var prevBlock = prev.block;
+ var prevType = prev.type;
+
+ if (prevType !== 'Rule') {
+ var unsafe = utils.unsafeToSkipNode.call(selectors, prev);
+
+ if (!unsafe && prevType === 'Atrule' && prevBlock) {
+ walk(prevBlock, {
+ visit: 'Rule',
+ enter: function(node) {
+ node.prelude.children.each(function(data) {
+ disallowDownMarkers[data.compareMarker] = true;
+ });
+ }
+ });
+ }
+
+ return unsafe;
+ }
+
+ var prevSelectors = prev.prelude.children;
+
+ if (node.pseudoSignature !== prev.pseudoSignature) {
+ return true;
+ }
+
+ allowMergeDown = !prevSelectors.some(function(selector) {
+ return selector.compareMarker in disallowDownMarkers;
+ });
+
+ // try prev ruleset if simpleselectors has no equal specifity and element selector
+ if (!allowMergeDown && !allowMergeUp) {
+ return true;
+ }
+
+ // try to join by selectors
+ if (allowMergeUp && utils.isEqualSelectors(prevSelectors, selectors)) {
+ prevBlock.children.appendList(block.children);
+ list.remove(item);
+ return true;
+ }
+
+ // try to join by properties
+ var diff = utils.compareDeclarations(block.children, prevBlock.children);
+
+ // console.log(diff.eq, diff.ne1, diff.ne2);
+
+ if (diff.eq.length) {
+ if (!diff.ne1.length && !diff.ne2.length) {
+ // equal blocks
+ if (allowMergeDown) {
+ utils.addSelectors(selectors, prevSelectors);
+ list.remove(prevItem);
+ }
+
+ return true;
+ } else if (!avoidRulesMerge) { /* probably we don't need to prevent those merges for @keyframes
+ TODO: need to be checked */
+
+ if (diff.ne1.length && !diff.ne2.length) {
+ // prevBlock is subset block
+ var selectorLength = calcSelectorLength(selectors);
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ if (allowMergeUp && selectorLength < blockLength) {
+ utils.addSelectors(prevSelectors, selectors);
+ block.children = new List().fromArray(diff.ne1);
+ }
+ } else if (!diff.ne1.length && diff.ne2.length) {
+ // node is subset of prevBlock
+ var selectorLength = calcSelectorLength(prevSelectors);
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ if (allowMergeDown && selectorLength < blockLength) {
+ utils.addSelectors(selectors, prevSelectors);
+ prevBlock.children = new List().fromArray(diff.ne2);
+ }
+ } else {
+ // diff.ne1.length && diff.ne2.length
+ // extract equal block
+ var newSelector = {
+ type: 'SelectorList',
+ loc: null,
+ children: utils.addSelectors(prevSelectors.copy(), selectors)
+ };
+ var newBlockLength = calcSelectorLength(newSelector.children) + 2; // selectors length + curly braces length
+ var blockLength = calcDeclarationsLength(diff.eq); // declarations length
+
+ // create new ruleset if declarations length greater than
+ // ruleset description overhead
+ if (blockLength >= newBlockLength) {
+ var newItem = list.createItem({
+ type: 'Rule',
+ loc: null,
+ prelude: newSelector,
+ block: {
+ type: 'Block',
+ loc: null,
+ children: new List().fromArray(diff.eq)
+ },
+ pseudoSignature: node.pseudoSignature
+ });
+
+ block.children = new List().fromArray(diff.ne1);
+ prevBlock.children = new List().fromArray(diff.ne2overrided);
+
+ if (allowMergeUp) {
+ list.insert(newItem, prevItem);
+ } else {
+ list.insert(newItem, item);
+ }
+
+ return true;
+ }
+ }
+ }
+ }
+
+ if (allowMergeUp) {
+ // TODO: disallow up merge only if any property interception only (i.e. diff.ne2overrided.length > 0);
+ // await property families to find property interception correctly
+ allowMergeUp = !prevSelectors.some(function(prevSelector) {
+ return selectors.some(function(selector) {
+ return selector.compareMarker === prevSelector.compareMarker;
+ });
+ });
+ }
+
+ prevSelectors.each(function(data) {
+ disallowDownMarkers[data.compareMarker] = true;
+ });
+ });
+}
+
+module.exports = function restructRule(ast) {
+ walk(ast, {
+ visit: 'Rule',
+ reverse: true,
+ enter: processRule
+ });
+};
diff --git a/node_modules/csso/lib/restructure/index.js b/node_modules/csso/lib/restructure/index.js
new file mode 100644
index 0000000..e00f6cb
--- /dev/null
+++ b/node_modules/csso/lib/restructure/index.js
@@ -0,0 +1,35 @@
+var prepare = require('./prepare/index');
+var mergeAtrule = require('./1-mergeAtrule');
+var initialMergeRuleset = require('./2-initialMergeRuleset');
+var disjoinRuleset = require('./3-disjoinRuleset');
+var restructShorthand = require('./4-restructShorthand');
+var restructBlock = require('./6-restructBlock');
+var mergeRuleset = require('./7-mergeRuleset');
+var restructRuleset = require('./8-restructRuleset');
+
+module.exports = function(ast, options) {
+ // prepare ast for restructing
+ var indexer = prepare(ast, options);
+ options.logger('prepare', ast);
+
+ mergeAtrule(ast, options);
+ options.logger('mergeAtrule', ast);
+
+ initialMergeRuleset(ast);
+ options.logger('initialMergeRuleset', ast);
+
+ disjoinRuleset(ast);
+ options.logger('disjoinRuleset', ast);
+
+ restructShorthand(ast, indexer);
+ options.logger('restructShorthand', ast);
+
+ restructBlock(ast);
+ options.logger('restructBlock', ast);
+
+ mergeRuleset(ast);
+ options.logger('mergeRuleset', ast);
+
+ restructRuleset(ast);
+ options.logger('restructRuleset', ast);
+};
diff --git a/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js b/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js
new file mode 100644
index 0000000..80c551d
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/createDeclarationIndexer.js
@@ -0,0 +1,31 @@
+var generate = require('css-tree').generate;
+
+function Index() {
+ this.seed = 0;
+ this.map = Object.create(null);
+}
+
+Index.prototype.resolve = function(str) {
+ var index = this.map[str];
+
+ if (!index) {
+ index = ++this.seed;
+ this.map[str] = index;
+ }
+
+ return index;
+};
+
+module.exports = function createDeclarationIndexer() {
+ var ids = new Index();
+
+ return function markDeclaration(node) {
+ var id = generate(node);
+
+ node.id = ids.resolve(id);
+ node.length = id.length;
+ node.fingerprint = null;
+
+ return node;
+ };
+};
diff --git a/node_modules/csso/lib/restructure/prepare/index.js b/node_modules/csso/lib/restructure/prepare/index.js
new file mode 100644
index 0000000..a1fd335
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/index.js
@@ -0,0 +1,43 @@
+var resolveKeyword = require('css-tree').keyword;
+var walk = require('css-tree').walk;
+var generate = require('css-tree').generate;
+var createDeclarationIndexer = require('./createDeclarationIndexer');
+var processSelector = require('./processSelector');
+
+module.exports = function prepare(ast, options) {
+ var markDeclaration = createDeclarationIndexer();
+
+ walk(ast, {
+ visit: 'Rule',
+ enter: function processRule(node) {
+ node.block.children.each(markDeclaration);
+ processSelector(node, options.usage);
+ }
+ });
+
+ walk(ast, {
+ visit: 'Atrule',
+ enter: function(node) {
+ if (node.prelude) {
+ node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate
+ node.prelude.id = generate(node.prelude);
+ }
+
+ // compare keyframe selectors by its values
+ // NOTE: still no clarification about problems with keyframes selector grouping (issue #197)
+ if (resolveKeyword(node.name).basename === 'keyframes') {
+ node.block.avoidRulesMerge = true; /* probably we don't need to prevent those merges for @keyframes
+ TODO: need to be checked */
+ node.block.children.each(function(rule) {
+ rule.prelude.children.each(function(simpleselector) {
+ simpleselector.compareMarker = simpleselector.id;
+ });
+ });
+ }
+ }
+ });
+
+ return {
+ declaration: markDeclaration
+ };
+};
diff --git a/node_modules/csso/lib/restructure/prepare/processSelector.js b/node_modules/csso/lib/restructure/prepare/processSelector.js
new file mode 100644
index 0000000..3db19ab
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/processSelector.js
@@ -0,0 +1,94 @@
+var generate = require('css-tree').generate;
+var specificity = require('./specificity');
+
+var nonFreezePseudoElements = {
+ 'first-letter': true,
+ 'first-line': true,
+ 'after': true,
+ 'before': true
+};
+var nonFreezePseudoClasses = {
+ 'link': true,
+ 'visited': true,
+ 'hover': true,
+ 'active': true,
+ 'first-letter': true,
+ 'first-line': true,
+ 'after': true,
+ 'before': true
+};
+
+module.exports = function freeze(node, usageData) {
+ var pseudos = Object.create(null);
+ var hasPseudo = false;
+
+ node.prelude.children.each(function(simpleSelector) {
+ var tagName = '*';
+ var scope = 0;
+
+ simpleSelector.children.each(function(node) {
+ switch (node.type) {
+ case 'ClassSelector':
+ if (usageData && usageData.scopes) {
+ var classScope = usageData.scopes[node.name] || 0;
+
+ if (scope !== 0 && classScope !== scope) {
+ throw new Error('Selector can\'t has classes from different scopes: ' + generate(simpleSelector));
+ }
+
+ scope = classScope;
+ }
+ break;
+
+ case 'PseudoClassSelector':
+ var name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoClasses.hasOwnProperty(name)) {
+ pseudos[':' + name] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'PseudoElementSelector':
+ var name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoElements.hasOwnProperty(name)) {
+ pseudos['::' + name] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'TypeSelector':
+ tagName = node.name.toLowerCase();
+ break;
+
+ case 'AttributeSelector':
+ if (node.flags) {
+ pseudos['[' + node.flags.toLowerCase() + ']'] = true;
+ hasPseudo = true;
+ }
+ break;
+
+ case 'WhiteSpace':
+ case 'Combinator':
+ tagName = '*';
+ break;
+ }
+ });
+
+ simpleSelector.compareMarker = specificity(simpleSelector).toString();
+ simpleSelector.id = null; // pre-init property to avoid multiple hidden class
+ simpleSelector.id = generate(simpleSelector);
+
+ if (scope) {
+ simpleSelector.compareMarker += ':' + scope;
+ }
+
+ if (tagName !== '*') {
+ simpleSelector.compareMarker += ',' + tagName;
+ }
+ });
+
+ // add property to all rule nodes to avoid multiple hidden class
+ node.pseudoSignature = hasPseudo && Object.keys(pseudos).sort().join(',');
+};
diff --git a/node_modules/csso/lib/restructure/prepare/specificity.js b/node_modules/csso/lib/restructure/prepare/specificity.js
new file mode 100644
index 0000000..104a18a
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/specificity.js
@@ -0,0 +1,56 @@
+module.exports = function specificity(simpleSelector) {
+ var A = 0;
+ var B = 0;
+ var C = 0;
+
+ simpleSelector.children.each(function walk(node) {
+ switch (node.type) {
+ case 'SelectorList':
+ case 'Selector':
+ node.children.each(walk);
+ break;
+
+ case 'IdSelector':
+ A++;
+ break;
+
+ case 'ClassSelector':
+ case 'AttributeSelector':
+ B++;
+ break;
+
+ case 'PseudoClassSelector':
+ switch (node.name.toLowerCase()) {
+ case 'not':
+ node.children.each(walk);
+ break;
+
+ case 'before':
+ case 'after':
+ case 'first-line':
+ case 'first-letter':
+ C++;
+ break;
+
+ // TODO: support for :nth-*(.. of <SelectorList>), :matches(), :has()
+ default:
+ B++;
+ }
+ break;
+
+ case 'PseudoElementSelector':
+ C++;
+ break;
+
+ case 'TypeSelector':
+ // ignore universal selector
+ if (node.name.charAt(node.name.length - 1) !== '*') {
+ C++;
+ }
+ break;
+
+ }
+ });
+
+ return [A, B, C];
+};
diff --git a/node_modules/csso/lib/restructure/utils.js b/node_modules/csso/lib/restructure/utils.js
new file mode 100644
index 0000000..bdc3471
--- /dev/null
+++ b/node_modules/csso/lib/restructure/utils.js
@@ -0,0 +1,151 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function isEqualSelectors(a, b) {
+ var cursor1 = a.head;
+ var cursor2 = b.head;
+
+ while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+ cursor1 = cursor1.next;
+ cursor2 = cursor2.next;
+ }
+
+ return cursor1 === null && cursor2 === null;
+}
+
+function isEqualDeclarations(a, b) {
+ var cursor1 = a.head;
+ var cursor2 = b.head;
+
+ while (cursor1 !== null && cursor2 !== null && cursor1.data.id === cursor2.data.id) {
+ cursor1 = cursor1.next;
+ cursor2 = cursor2.next;
+ }
+
+ return cursor1 === null && cursor2 === null;
+}
+
+function compareDeclarations(declarations1, declarations2) {
+ var result = {
+ eq: [],
+ ne1: [],
+ ne2: [],
+ ne2overrided: []
+ };
+
+ var fingerprints = Object.create(null);
+ var declarations2hash = Object.create(null);
+
+ for (var cursor = declarations2.head; cursor; cursor = cursor.next) {
+ declarations2hash[cursor.data.id] = true;
+ }
+
+ for (var cursor = declarations1.head; cursor; cursor = cursor.next) {
+ var data = cursor.data;
+
+ if (data.fingerprint) {
+ fingerprints[data.fingerprint] = data.important;
+ }
+
+ if (declarations2hash[data.id]) {
+ declarations2hash[data.id] = false;
+ result.eq.push(data);
+ } else {
+ result.ne1.push(data);
+ }
+ }
+
+ for (var cursor = declarations2.head; cursor; cursor = cursor.next) {
+ var data = cursor.data;
+
+ if (declarations2hash[data.id]) {
+ // when declarations1 has an overriding declaration, this is not a difference
+ // unless no !important is used on prev and !important is used on the following
+ if (!hasOwnProperty.call(fingerprints, data.fingerprint) ||
+ (!fingerprints[data.fingerprint] && data.important)) {
+ result.ne2.push(data);
+ }
+
+ result.ne2overrided.push(data);
+ }
+ }
+
+ return result;
+}
+
+function addSelectors(dest, source) {
+ source.each(function(sourceData) {
+ var newStr = sourceData.id;
+ var cursor = dest.head;
+
+ while (cursor) {
+ var nextStr = cursor.data.id;
+
+ if (nextStr === newStr) {
+ return;
+ }
+
+ if (nextStr > newStr) {
+ break;
+ }
+
+ cursor = cursor.next;
+ }
+
+ dest.insert(dest.createItem(sourceData), cursor);
+ });
+
+ return dest;
+}
+
+// check if simpleselectors has no equal specificity and element selector
+function hasSimilarSelectors(selectors1, selectors2) {
+ var cursor1 = selectors1.head;
+
+ while (cursor1 !== null) {
+ var cursor2 = selectors2.head;
+
+ while (cursor2 !== null) {
+ if (cursor1.data.compareMarker === cursor2.data.compareMarker) {
+ return true;
+ }
+
+ cursor2 = cursor2.next;
+ }
+
+ cursor1 = cursor1.next;
+ }
+
+ return false;
+}
+
+// test node can't to be skipped
+function unsafeToSkipNode(node) {
+ switch (node.type) {
+ case 'Rule':
+ // unsafe skip ruleset with selector similarities
+ return hasSimilarSelectors(node.prelude.children, this);
+
+ case 'Atrule':
+ // can skip at-rules with blocks
+ if (node.block) {
+ // unsafe skip at-rule if block contains something unsafe to skip
+ return node.block.children.some(unsafeToSkipNode, this);
+ }
+ break;
+
+ case 'Declaration':
+ return false;
+ }
+
+ // unsafe by default
+ return true;
+}
+
+module.exports = {
+ isEqualSelectors: isEqualSelectors,
+ isEqualDeclarations: isEqualDeclarations,
+ compareDeclarations: compareDeclarations,
+ addSelectors: addSelectors,
+ hasSimilarSelectors: hasSimilarSelectors,
+ unsafeToSkipNode: unsafeToSkipNode
+};
diff --git a/node_modules/csso/lib/usage.js b/node_modules/csso/lib/usage.js
new file mode 100644
index 0000000..40b3ddb
--- /dev/null
+++ b/node_modules/csso/lib/usage.js
@@ -0,0 +1,79 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function buildMap(list, caseInsensitive) {
+ var map = Object.create(null);
+
+ if (!Array.isArray(list)) {
+ return null;
+ }
+
+ for (var i = 0; i < list.length; i++) {
+ var name = list[i];
+
+ if (caseInsensitive) {
+ name = name.toLowerCase();
+ }
+
+ map[name] = true;
+ }
+
+ return map;
+}
+
+function buildList(data) {
+ if (!data) {
+ return null;
+ }
+
+ var tags = buildMap(data.tags, true);
+ var ids = buildMap(data.ids);
+ var classes = buildMap(data.classes);
+
+ if (tags === null &&
+ ids === null &&
+ classes === null) {
+ return null;
+ }
+
+ return {
+ tags: tags,
+ ids: ids,
+ classes: classes
+ };
+}
+
+function buildIndex(data) {
+ var scopes = false;
+
+ if (data.scopes && Array.isArray(data.scopes)) {
+ scopes = Object.create(null);
+
+ for (var i = 0; i < data.scopes.length; i++) {
+ var list = data.scopes[i];
+
+ if (!list || !Array.isArray(list)) {
+ throw new Error('Wrong usage format');
+ }
+
+ for (var j = 0; j < list.length; j++) {
+ var name = list[j];
+
+ if (hasOwnProperty.call(scopes, name)) {
+ throw new Error('Class can\'t be used for several scopes: ' + name);
+ }
+
+ scopes[name] = i + 1;
+ }
+ }
+ }
+
+ return {
+ whitelist: buildList(data),
+ blacklist: buildList(data.blacklist),
+ scopes: scopes
+ };
+}
+
+module.exports = {
+ buildIndex: buildIndex
+};
diff --git a/node_modules/csso/node_modules/css-tree/CHANGELOG.md b/node_modules/csso/node_modules/css-tree/CHANGELOG.md
new file mode 100644
index 0000000..da3d02f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/CHANGELOG.md
@@ -0,0 +1,584 @@
+## 1.1.2
+
+- Rolled back to use spread syntax in object literals since it not supported by nodejs < 8.3 (#145)
+
+## 1.1.1 (November 18, 2020)
+
+- Fixed edge cases in mismatch location computation for `SyntaxMatchError`
+
+## 1.1.0 (November 17, 2020)
+
+- Bumped `mdn-data` to 2.0.14
+- Extended `fork()` method to allow append syntax instead of overriding for `types`, `properties` and `atrules`, e.g. `csstree.fork({ types: { color: '| foo | bar' } })`
+- Extended lexer API for validation
+ - Added `Lexer#checkAtruleName(atruleName)`, `Lexer#checkAtrulePrelude(atruleName, prelude)`, `Lexer#checkAtruleDescriptorName(atruleName, descriptorName)` and `Lexer#checkPropertyName(propertyName)`
+ - Added `Lexer#getAtrule(atruleName, fallbackBasename)` method
+ - Extended `Lexer#getAtrulePrelude()` and `Lexer#getProperty()` methods to take `fallbackBasename` parameter
+ - Improved `SyntaxMatchError` location details
+ - Changed error messages
+
+## 1.0.1 (November 11, 2020)
+
+- Fixed edge cases for parsing of custom property value with a single whitespace when `parseCustomProperty:true`
+
+## 1.0.0 (October 27, 2020)
+
+- Added `onComment` option to parser config
+- Added support for `break` and `skip` values in `walk()` to control traversal
+- Added `List#reduce()` and `List#reduceRight()` methods
+- Bumped `mdn-data` to 2.0.12
+- Exposed version of the lib (i.e. `import { version } from 'css-tree'`)
+- Fixed `Lexer#dump()` to dump atrules syntaxes as well
+- Fixed matching comma separated `<urange>` list (#135)
+- Renamed `HexColor` node type into `Hash`
+- Removed `element()` specific parsing rules
+- Removed `dist/default-syntax.json` from package
+
+## 1.0.0-alpha.39 (December 5, 2019)
+
+- Fixed walker with `visit: "Declaration"` to iterate `DeclarationList` (#114)
+
+## 1.0.0-alpha.38 (November 25, 2019)
+
+- Bumped `mdn-data` to `2.0.6`
+- Added initial implmentation for at-rule matching via `Lexer#matchAtrulePrelude()` and `Lexer#matchAtruleDescriptor()` methods
+- Added `-moz-control-character-visibility`, `-ms-grid-columns`, `-ms-grid-rows` and `-ms-hyphenate-limit-last` properties to patch (#111)
+- Added `flow`, `flow-root` and `table-caption` values to patched `display` (#112)
+
+## 1.0.0-alpha.37 (October 22, 2019)
+
+- Bumped `source-map` version to `^0.6.1` to fix source map generation inconsistency across node.js versions due to mappings sorting bug and v8 moving to [a stable Array#sort](https://v8.dev/blog/array-sort) ([fix commit](https://github.com/mozilla/source-map/commit/f35a2e4212dd025cb5e1fc219e7ac8a4b96c2cc9) in `source-map`)
+
+## 1.0.0-alpha.36 (October 13, 2019)
+
+- Dropped support for Node < 8
+- Updated dev deps (fixed `npm audit` issues)
+- Reworked build pipeline
+ - Package provides `dist/csstree.js` and `dist/csstree.min.js` now (instead of single `dist/csstree.js` that was a min version)
+ - Bundle size (min version) reduced from 191Kb to 158Kb due to some optimisations
+- Definition syntax
+ - Renamed `grammar` into `definitionSyntax` (named per spec)
+ - Added `compact` option to `generate()` method to avoid formatting (spaces) when possible
+- Lexer
+ - Changed `dump()` method to produce syntaxes in compact form by default
+
+## 1.0.0-alpha.35 (October 7, 2019)
+
+- Walker
+ - Changed implementation to avoid runtime compilation due to CSP issues (see #91, #109)
+ - Added `find()`, `findLast()` and `findAll()` methods (e.g. `csstree.find(ast, node => node.type === 'ClassSelector')`)
+
+## 1.0.0-alpha.34 (July 27, 2019)
+
+- Tokenizer
+ - Added `isBOM()` function
+ - Added `charCodeCategory()` function
+ - Removed `firstCharOffset()` function (use `isBOM()` instead)
+ - Removed `CHARCODE` dictionary
+ - Removed `INPUT_STREAM_CODE*` dictionaries
+- Lexer
+ - Allowed comments in matching value (just ignore them like whitespaces)
+ - Increased iteration count in value matching from 10k up to 15k
+ - Fixed missed `debugger` (#104)
+
+## 1.0.0-alpha.33 (July 11, 2019)
+
+- Lexer
+ - Fixed low priority productions matching by changing an approach for robust one (#103)
+
+## 1.0.0-alpha.32 (July 11, 2019)
+
+- Lexer
+ - Fixed low priority productions matching in long `||-` and `&&-` groups (#103)
+
+## 1.0.0-alpha.31 (July 11, 2019)
+
+- Bumped `mdn/data` to `2.0.4` (#99)
+- Lexer
+ - Added [bracketed range notation](https://drafts.csswg.org/css-values-4/#numeric-ranges) support and related refactoring
+ - Removed `<number-zero-one>`, `<number-one-or-greater>` and `<positive-integer>` from generic types. In fact, types moved to patch, because those types can be expressed in a regular grammar due to bracketed range notation implemented
+ - Added support for multiple token string matching
+ - Improved `<custom-ident>` production matching to claim the keyword only if no other unfulfilled production can claim it (#101)
+ - Improved `<length>` production matching to claim "unitless zero" only if no other unfulfilled production can claim it
+ - Changed lexer's constructor to prevent generic types override when used
+ - Fixed large `||`- and `&&`-group matching, matching continues from the beginning on term match (#85)
+ - Fixed checking that value has `var()` occurrences when value is a string (such values can't be matched on syntax currently and fail with specific error that can be used for ignorance in validation tools)
+ - Fixed `<declaration-value>` and `<any-value>` matching when a value contains a function, parentheses or braces
+
+## 1.0.0-alpha.30 (July 3, 2019)
+
+- Bumped `mdn/data` to `~2.0.3`
+ - Removed type removals from `mdn/data` due to lack of some generic types and specific lexer restictions (since lexer was reworked, see below)
+ - Reduced and updated patches
+- Tokenizer
+ - Reworked tokenizer itself to compliment [CSS Syntax Module Level 3](https://drafts.csswg.org/css-syntax/#tokenization)
+ - `Tokenizer` class splitted into several abstractions:
+ - Added `TokenStream` class
+ - Added `OffsetToLocation` class
+ - Added `tokenize()` function that creates `TokenStream` instance for given string or updates a `TokenStream` instance passed as second parameter
+ - Removed `Tokenizer` class
+ - Removed `Raw` token type
+ - Renamed `Identifier` token type to `Ident`
+ - Added token types: `Hash`, `BadString`, `BadUrl`, `Delim`, `Percentage`, `Dimension`, `Colon`, `Semicolon`, `Comma`, `LeftSquareBracket`, `RightSquareBracket`, `LeftParenthesis`, `RightParenthesis`, `LeftCurlyBracket`, `RightCurlyBracket`
+ - Replaced `Punctuator` with `Delim` token type, that excludes specific characters with its own token type like `Colon`, `Semicolon` etc
+ - Removed `findCommentEnd`, `findStringEnd`, `findDecimalNumberEnd`, `findNumberEnd`, `findEscapeEnd`, `findIdentifierEnd` and `findUrlRawEnd` helper function
+ - Removed `SYMBOL_TYPE`, `PUNCTUATION` and `STOP_URL_RAW` dictionaries
+ - Added `isDigit`, `isHexDigit`, `isUppercaseLetter`, `isLowercaseLetter`, `isLetter`, `isNonAscii`, `isNameStart`, `isName`, `isNonPrintable`, `isNewline`, `isWhiteSpace`, `isValidEscape`, `isIdentifierStart`, `isNumberStart`, `consumeEscaped`, `consumeName`, `consumeNumber` and `consumeBadUrlRemnants` helper functions
+- Parser
+ - Changed parsing algorithms to work with new token type set
+ - Changed `HexColor` consumption in way to relax checking a value, i.e. now `value` is a sequence of one or more name chars
+ - Added `&` as a property hack
+ - Relaxed `var()` parsing to only check that a first arguments is an identifier (not a custom property name as before)
+- Lexer
+ - Reworked syntax matching to relay on token set only (having AST is optional now)
+ - Extended `Lexer#match()`, `Lexer#matchType()` and `Lexer#matchProperty()` methods to take a string as value, beside AST as a value
+ - Extended `Lexer#match()` method to take a string as a syntax, beside of syntax descriptor
+ - Reworked generic types:
+ - Removed `<attr()>`, `<url>` (moved to patch) and `<progid>` types
+ - Added types:
+ - Related to token types: `<ident-token>`, `<function-token>`, `<at-keyword-token>`, `<hash-token>`, `<string-token>`, `<bad-string-token>`, `<url-token>`, `<bad-url-token>`, `<delim-token>`, `<number-token>`, `<percentage-token>`, `<dimension-token>`, `<whitespace-token>`, `<CDO-token>`, `<CDC-token>`, `<colon-token>`, `<semicolon-token>`, `<comma-token>`, `<[-token>`, `<]-token>`, `<(-token>`, `<)-token>`, `<{-token>` and `<}-token>`
+ - Complex types: `<an-plus-b>`, `<urange>`, `<custom-property-name>`, `<declaration-value>`, `<any-value>` and `<zero>`
+ - Renamed `<unicode-range>` to `<urange>` as per spec
+ - Renamed `<expression>` (IE legacy extension) to `<-ms-legacy-expression>` and may to be removed in next releases
+
+## 1.0.0-alpha.29 (May 30, 2018)
+
+- Lexer
+ - Syntax matching was completely reworked. Now it's token-based and uses state machine. Public API has not changed. However, some internal data structures have changed. Most significal change in syntax match result tree structure, it's became token-based instead of node-based.
+ - Grammar
+ - Changed grammar tree format:
+ - Added `Token` node type to represent a single code point (`<delim-token>`)
+ - Added `Multiplier` that wraps a single node (`term` property)
+ - Added `AtKeyword` to represent `<at-keyword-token>`
+ - Removed `Slash` and `Percent` node types, they are replaced for a node with `Token` type
+ - Changed `Function` to represent `<function-token>` with no children
+ - Removed `multiplier` property from `Group`
+ - Changed `generate()` method:
+ - Method takes an `options` as second argument now (`generate(node, forceBraces, decorator)` -> `generate(node, options)`). Two options are supported: `forceBraces` and `decorator`
+ - When a second parameter is a function it treats as `decorate` option value, i.e. `generate(node, fn)` -> `generate(node, { decorate: fn })`
+ - Decorate function invokes with additional parameter – a reference to a node
+- Tokenizer
+ - Renamed `Atrule` const to `AtKeyword`
+
+## 1.0.0-alpha.28 (February 19, 2018)
+
+- Renamed `lexer.grammar.translate()` method into `generate()`
+- Fixed `<'-webkit-font-smoothing'>` and `<'-moz-osx-font-smoothing'>` syntaxes (#75)
+- Added vendor keywords for `<'overflow'>` property syntax (#76)
+- Pinned `mdn-data` to `~1.1.0` and fixed issues with some updated property syntaxes
+
+## 1.0.0-alpha.27 (January 14, 2018)
+
+- Generator
+ - Changed node's `generate()` methods invocation, methods now take a node as a single argument and context (i.e. `this`) that have methods: `chunk()`, `node()` and `children()`
+ - Renamed `translate()` to `generate()` and changed to take `options` argument
+ - Removed `translateMarkup(ast, enter, leave)` method, use `generate(ast, { decorator: (handlers) => { ... }})` instead
+ - Removed `translateWithSourceMap(ast)`, use `generate(ast, { sourceMap: true })` instead
+ - Changed to support for children as an array
+- Walker
+ - Changed `walk()` to take an `options` argument instead of handler, with `enter`, `leave`, `visit` and `reverse` options (`walk(ast, fn)` is still works and equivalent to `walk(ast, { enter: fn })`)
+ - Removed `walkUp(ast, fn)`, use `walk(ast, { leave: fn })`
+ - Removed `walkRules(ast, fn)`, use `walk(ast, { visit: 'Rule', enter: fn })` instead
+ - Removed `walkRulesRight(ast, fn)`, use `walk(ast, { visit: 'Rule', reverse: true, enter: fn })` instead
+ - Removed `walkDeclarations(ast, fn)`, use `walk(ast, { visit: 'Declaration', enter: fn })` instead
+ - Changed to support for children as array in most cases (`reverse: true` will fail on arrays since they have no `forEachRight()` method)
+- Misc
+ - List
+ - Added `List#forEach()` method
+ - Added `List#forEachRight()` method
+ - Added `List#filter()` method
+ - Changed `List#map()` method to return a `List` instance instead of `Array`
+ - Added `List#push()` method, similar to `List#appendData()` but returns nothing
+ - Added `List#pop()` method
+ - Added `List#unshift()` method, similar to `List#prependData()` but returns nothing
+ - Added `List#shift()` method
+ - Added `List#prependList()` method
+ - Changed `List#insert()`, `List#insertData()`, `List#appendList()` and `List#insertList()` methods to return a list that performed an operation
+ - Changed `keyword()` method
+ - Changed `name` field to include a vendor prefix
+ - Added `basename` field to contain a name without a vendor prefix
+ - Added `custom` field that contain a `true` when keyword is a custom property reference
+ - Changed `property()` method
+ - Changed `name` field to include a vendor prefix
+ - Added `basename` field to contain a name without any prefixes, i.e. a hack and a vendor prefix
+ - Added `vendorPrefix()` method
+ - Added `isCustomProperty()` method
+
+## 1.0.0-alpha.26 (November 9, 2017)
+
+- Tokenizer
+ - Added `Tokenizer#isBalanceEdge()` method
+ - Removed `Tokenizer.endsWith()` method
+- Parser
+ - Made the parser tolerant to errors by default
+ - Removed `tolerant` parser option (no parsing modes anymore)
+ - Removed `property` parser option (a value parsing does not depend on property name anymore)
+ - Canceled error for a handing semicolon in a block
+ - Canceled error for unclosed `Brackets`, `Function` and `Parentheses` when EOF is reached
+ - Fixed error when prelude ends with a comment for at-rules with custom prelude consumer
+ - Relaxed at-rule parsing:
+ - Canceled error when EOF is reached after a prelude
+ - Canceled error for an at-rule with custom block consumer when at-rule has no block (just don't apply consumer in that case)
+ - Canceled error on at-rule parsing when it occurs outside prelude or block (at-rule is converting to `Raw` node)
+ - Allowed for any at-rule to have a prelude and a block, even if it's invalid per at-rule syntax (the responsibility for this check is moved to lexer, since it's possible to construct a AST with such errors)
+ - Made a declaration value a safe parsing point (i.e. error on value parsing lead to a value is turning into `Raw` node, not a declaration as before)
+ - Excluded surrounding white spaces and comments from a `Raw` node that represents a declaration value
+ - Changed `Value` parse handler to return a node only with type `Value` (previously it returned a `Raw` node in some cases)
+ - Fixed issue with `onParseError()` is not invoked for errors occured on selector or declaration value parsing in some cases
+ - Changed using of `onParseError()` to stop parsing if handler throws an exception
+- Lexer
+ - Changed `grammar.walk()` to invoke passed handler on entering to node rather than on leaving the node
+ - Improved `grammar.walk()` to take a walk handler pair as an object, i.e. `walk(node, { enter: fn, leave: fn })`
+ - Changed `Lexer#match*()` methods to take a node of any type, but with a `children` field
+ - Added `Lexer#match(syntax, node)` method
+ - Fixed `Lexer#matchType()` method to stop return a positive result for the CSS wide keywords
+
+## 1.0.0-alpha25 (October 9, 2017)
+
+- Parser
+ - Added fallback node as argument to `onParseError()` handler
+ - Fixed raw consuming in tolerant mode when selector is invalid (greedy consuming and redundant warnings)
+ - Fixed exception in tolerant mode caused by unknown at-rule with unclosed block
+ - Changed handling of semicolons:
+ - Hanging semicolon inside declaration blocks raise an error or turns into a `Raw` node in tolerant mode instead of being ignored
+ - Semicolon outside of declaration blocks opens a `Rule` node as part of selector instead of being ignored
+ - Aligned `parseAtrulePrelude` behaviour to `parseRulePrelude`
+ - Removed `Raw` node wraping into `AtrulePrelude` when `parseAtrulePrelude` is disabled
+ - Removed error emitting when at-rule has a custom prelude customer but no prelude is found (it should be validated by a lexer later)
+- Generator
+ - Fixed performance issue with `translateWithSourceMap()`, flattening the string (because of mixing building string and indexing into it) turned it into a quadratic algorithm (approximate numbers can be found in [the quiz created by this case](https://gist.github.com/lahmatiy/ea25d0e623d88ca9848384b5707d52d9))
+- Added support for a single solidus hack for `property()`
+- Minor fixes for custom errors
+
+## 1.0.0-alpha24 (September 14, 2017)
+
+- Improved CSSTree to be stable for standart build-in objects extension (#58)
+- Parser
+ - Renamed rule's `selector` to `prelude`. The reasons: [spec names this part so](https://www.w3.org/TR/css-syntax-3/#qualified-rule), and this branch can contain not only a selector (`SelectorList`) but also a raw payload (`Raw`). What's changed:
+ - Renamed `Rule.selector` to `Rule.prelude`
+ - Renamed `parseSelector` parser option to `parseRulePrelude`
+ - Removed option for selector parse in `SelectorList`
+- Lexer
+ - Fixed undefined positions in a error when match a syntax to empty or white space only value
+ - Improved `Lexer#checkStructure()`
+ - Return a warning as an object with node reference and message
+ - No exception on unknown node type, return a warning instead
+
+## 1.0.0-alpha23 (September 10, 2017)
+
+- Fixed `Tokenizer#getRawLength()`'s false positive balance match to the end of input in some cases (#56)
+- Rename walker's entry point methods to be the same as CSSTree exposed methods (i.e. `walk()`, `walkUp()` etc)
+- Rename at-rule's `expression` to `prelude` (since [spec names it so](https://www.w3.org/TR/css-syntax-3/#at-rule))
+ - `AtruleExpression` node type → `AtrulePrelude`
+ - `Atrule.expression` field → `Atrule.prelude`
+ - `parseAtruleExpression` parser's option → `parseAtrulePrelude`
+ - `atruleExpression` parse context → `atrulePrelude`
+ - `atruleExpression` walk context reference → `atrulePrelude`
+
+## 1.0.0-alpha22 (September 8, 2017)
+
+- Parser
+ - Fixed exception on parsing of unclosed `{}-block` in tolerant mode
+ - Added tolerant mode support for `DeclarationList`
+ - Added standalone entry point, i.e. default parser can be used via `require('css-tree/lib/parser')` (#47)
+- Generator
+ - Changed generator to produce `+n` when `AnPlusB.a` is `+1` to be "round-trip" with parser
+ - Added standalone entry point, i.e. default generators can be used via `require('css-tree/lib/generator')`
+- Walker
+ - Added standalone entry point, i.e. default walkers can be used via `require('css-tree/lib/walker')` (#47)
+- Lexer
+ - Added `default` keyword to the list of invalid values for `<custom-ident>` (since it reversed per [spec](https://www.w3.org/TR/css-values/#custom-idents))
+- Convertors (`toPlainObject()` and `fromPlainObject()`) moved to `lib/convertor` (entry point is `require('css-tree/lib/convertor')`)
+
+## 1.0.0-alpha21 (September 5, 2017)
+
+- Tokenizer
+ - Added `Raw` token type
+ - Improved tokenization of `url()` with raw as url to be more spec complient
+ - Added `Tokenizer#balance` array computation on token layout
+ - Added `Tokenizer#getRawLength()` to compute a raw length with respect of block balance
+ - Added `Tokenizer#getTokenStart(offset)` method to get token start offset by token index
+ - Added `idx` and `balance` fields to each token of `Tokenizer#dump()` method result
+- Parser
+ - Added `onParseError` option
+ - Reworked node parsers that consume a `Raw` node to use a new approach. Since now a `Raw` node builds in `parser#Raw()` function only
+ - Changed semantic of `parser#Raw()`, it takes 5 parameters now (it might to be changed in future)
+ - Changed `parser#tolerantParse()` to pass a start token index to fallback function instead of source offset
+ - Fixed `AtruleExpression` consuming in tolerant mode
+ - Atrule handler to convert an empty `AtruleExpression` node into `null`
+ - Changed `AtruleExpression` handler to always return a node (before it could return a `null` in some cases)
+- Lexer
+ - Fixed comma match node for `#` multiplier
+ - Added reference name to `SyntaxReferenceError`
+- Additional fixes on custom errors
+- Reduced possible corruption of base config by `syntax.fork()`
+
+## 1.0.0-alpha20 (August 28, 2017)
+
+- Tokenizer
+ - Added `Atrule` token type (`<at-rule-token>` per spec)
+ - Added `Function` token type (`<function-token>` per spec)
+ - Added `Url` token type
+ - Replaced `Tokenizer#getTypes()` method with `Tokenizer#dump()` to get all tokens as an array
+ - Renamed `Tokenizer.TYPE.Whitespace` to `Tokenizer.TYPE.WhiteSpace`
+ - Renamed `Tokenizer.findWhitespaceEnd()` to `Tokenizer.findWhiteSpaceEnd()`
+- Parser
+ - Added initial implementation of tollerant mode (turn on by passing `tolerant: true` option). In this mode parse errors are never occour and any invalid part of CSS turns into a `Raw` node. Current safe points: `Atrule`, `AtruleExpression`, `Rule`, `Selector` and `Declaration`. Feature is experimental and further improvements are planned.
+ - Changed `Atrule.expression` to contain a `AtruleExpression` node or `null` only (other node types is wrapping into a `AtruleExpression` node)
+ - Renamed `AttributeSelector.operator` to `AttributeSelector.matcher`
+- Generator
+ - `translate()` method is now can take a function as second argument, that recieves every generated chunk. When no function is passed, default handler is used, it concats all the chunks and method returns a string.
+- Lexer
+ - Used [mdn/data](https://github.com/mdn/data) package as source of lexer's grammar instead of local dictionaries
+ - Added `x` unit to `<resolution>` generic type
+ - Improved match tree:
+ - Omited Group (sequences) match nodes
+ - Omited empty match nodes (for terms with `zero or more` multipliers)
+ - Added `ASTNode` node type to contain a reference to AST node
+ - Fixed node duplication (uncompleted match were added to tree)
+ - Added AST node reference in match nodes
+ - Added comma match node by `#` multiplier
+ - Grammar
+ - Changed `translate()` function to get a handler as third argument (optional). That handler recieves result of node traslation and can be used for decoration purposes. See [example](https://github.com/csstree/docs/blob/04c65af44477b5ea05feb373482898122b2a4528/docs/syntax.html#L619-L627)
+ - Added `SyntaxParseError` to grammar export
+ - Reworked group and multipliers representation in syntax tree:
+ - Replaced `Sequence` for `Group` node type (`Sequence` node type removed)
+ - Added `explicit` boolean property for `Group`
+ - Only groups can have a multiplier now (other node types is wrapping into a single term implicit group when multiplier is applied)
+ - Renamed `nonEmpty` Group's property to `disallowEmpty`
+ - Added optimisation for syntax tree by dropping redundant root `Group` when it contains a single `Group` term (return this `Group` as a result)
+ - Changed lexer's match functionality
+ - Changed `Lexer#matchProperty()` and `Lexer#matchType()` to return an object instead of match tree. A match tree stores in `matched` field when AST is matched to grammar successfully, otherwise an error in `error` field. The result object also has some methods to test AST node against a match tree: `getTrace()`, `isType()`, `isProperty()` and `isKeyword()`
+ - Added `Lexer#matchDeclaration()` method
+ - Removed `Lexer#lastMatchError` (error stores in match result object in `error` field)
+ - Added initial implementation of search for AST segments (new lexer methods: `Lexer#findValueSegments()`, `Lexer#findDeclarationValueSegments()` and `Lexer#findAllSegments`)
+ - Implemented `SyntaxReferenceError` for unknown property and type references
+- Renamed field in resulting object of `property()` function: `variable` → `custom`
+- Fixed issue with readonly properties (e.g. `line` and `column`) of `Error` and exception on attempt to write in iOS Safari
+
+## 1.0.0-alpha19 (April 24, 2017)
+
+- Extended `List` class with new methods:
+ - `List#prepend(item)`
+ - `List#prependData(data)`
+ - `List#insertData(data)`
+ - `List#insertList(list)`
+ - `List#replace(item, itemOrList)`
+
+## 1.0.0-alpha18 (April 3, 2017)
+
+- Added `atrule` walk context (#39)
+- Changed a result of generate method for `AnPlusB`, `AttributeSelector`, `Function`, `MediaFeature` and `Ratio` ([1e95877](https://github.com/csstree/csstree/commit/1e9587710efa8e9338bcf0bc794b4b45f286231d))
+- Fixed typo in `List` exception messages (@strarsis, #42)
+- Improved tokenizer to convert an input to a string
+
+## 1.0.0-alpha17 (March 13, 2017)
+
+- Implemented new concept of `syntax`
+ - Changed main `exports` to expose a default syntax
+ - Defined initial [CSS syntax](lib/syntax/default.js)
+ - Implemented `createSyntax()` method to create a new syntax from scratch
+ - Implemented `fork()` method to create a new syntax based on given via extension
+- Parser
+ - Implemented `mediaQueryList` and `mediaQuery` parsing contexts
+ - Implemented `CDO` and `CDC` node types
+ - Implemented additional declaration property prefix hacks (`#` and `+`)
+ - Added support for UTF-16LE BOM
+ - Added support for `@font-face` at-rule
+ - Added `chroma()` to legacy IE filter functions
+ - Improved `HexColor` to consume hex only
+ - Improved support for `\0` and `\9` hacks (#2)
+ - Relaxed number check for `Ratio` terms
+ - Allowed fractal values as a `Ratio` term
+ - Disallowed zero number as a `Ratio` term
+ - Changed important clause parsing
+ - Allowed any identifier for important (to support hacks like `!ie`)
+ - Store `true` for `important` field in case identifier equals to `important` and string otherwise
+ - Fixed parse error formatted message rendering to take into account tabs
+ - Removed exposing of `Parser` class
+ - Removed `readSelectorSequence()`, `readSequenceFallback()` and `readSelectorSequenceFallback` methods
+ - Used single universal sequence consumer for `AtruleExpression`, `Selector` and `Value`
+- Generator
+ - Reworked generator to use auto-generated functions based on syntax definition (additional work to be done in next releases)
+ - Implemented `translateMarkup(ast, before, after)` method for complex cases
+ - Reworked `translateWithSourceMap` to be more flexible (based on `translateMarkup`, additional work to be done in next releases)
+- Walker
+ - Reworked walker to use auto-generated function based on syntax definition (additional work to be done in next releases)
+- Lexer
+ - Prepared for better extensibility (additional work to be done in next releases)
+ - Implemented `checkStructure(ast)` method to check AST structure based on syntax definition
+ - Update syntax dictionaries to latest `mdn/data`
+ - Add missing `<'offset-position'>` syntax
+ - Extended `<position>` property with `-webkit-sticky` (@sergejmueller, #37)
+ - Improved mismatch error position
+- Implemented script (`gen:syntax`) to generate AST format reference page (`docs/ast.md`) using syntax definition
+
+## 1.0.0-alpha16 (February 12, 2017)
+
+- Exposed `Parser` class
+- Added `startOffset` option to `Tokenizer` (constructor and `setSource()` method)
+- Added fallback functions for default (`readSequenceFallback`) and selector (`readSelectorSequenceFallback`) sequence readers
+- Fixed edge cases for `AnPlusB`
+- Fixed wrong whitespace ignoring in `Selector` consumer
+
+## 1.0.0-alpha15 (February 8, 2017)
+
+- Fixed broken `atruleExpression` context
+- Fixed vendor prefix detection in `keyword()` and `property()`
+- Fixed `property()` to not lowercase custom property names
+- Added `variable` boolean flag in `property()` result
+- Renamed `scanner` into `tokenizer`
+- Ranamed `syntax` into `lexer`
+- Moved `docs/*.html` files to [csstree/docs](https://github.com/csstree/docs) repo
+- Added `element()` function for `Value` context (`-moz-element()` supported as well)
+- Merged `Universal` node type into `Type`
+- Renamed node types:
+ - `Id` -> `IdSelector`
+ - `Class` -> `ClassSelector`
+ - `Type` -> `TypeSelector`
+ - `Attribute` -> `AttributeSelector`
+ - `PseudoClass` -> `PseudoClassSelector`
+ - `PseudoElement` -> `PseudoElementSelector`
+ - `Hash` -> `HexColor`
+ - `Space` -> `WhiteSpace`
+ - `An+B` -> `AnPlusB`
+- Removed `Progid` node type
+- Relaxed `MediaQuery` consumer to not validate syntax on parse and to include whitespaces in children sequence as is
+- Added `WhiteSpace.value` property to store whitespace sequence
+- Implemented parser options to specify what should be parsed in details (when option is `false` some part of CSS represents as balanced `Raw`):
+ - `parseAtruleExpression` – to parse at-rule expressions (`true` by default)
+ - `parseSelector` – to parse rule's selector (`true` by default)
+ - `parseValue` - to parse declaration's value (`true` by default)
+ - `parseCustomProperty` – to parse value and fallback of custom property (`false` by default)
+- Changed tokenization to stick leading hyphen minus to identifier token
+- Changed selector parsing:
+ - Don't convert spaces into descendant combinator
+ - Don't validate selector structure on parsing (selectors may be checked by lexer later)
+- Initial refactoring of [docs](https://github.com/csstree/csstree/blob/master/docs)
+- Various improvements and fixes
+
+## 1.0.0-alpha14 (February 3, 2017)
+
+- Implemented `DeclarationList`, `MediaQueryList`, `MediaQuery`, `MediaFeature` and `Ratio` node types
+- Implemented `declarationList` context (useful to parse HTML `style` attribute content)
+- Implemented custom consumers for `@import`, `@media`, `@page` and `@supports` at-rules
+- Implemented `atrule` option for `parse()` config, is used for `atruleExpession` context to specify custom consumer for at-rule if any
+- Added `Scanner#skipWS()`, `Scanner#eatNonWS()`, `Scanner#consume()` and `Scanner#consumeNonWS()` helper methods
+- Added custom consumers for known functional-pseudos, consume unknown functional-pseudo content as balanced `Raw`
+- Allowed any `PseudoElement` to be a functional-pseudo (#33)
+- Improved walker implementations to reduce GC thrashing by reusing cursors
+- Changed `Atrule.block` to contain a `Block` node type only if any
+- Changed `Block.loc` positions to include curly brackets
+- Changed `Atrule.expression` to store a `null` if no expression
+- Changed parser to use `StyleSheet` node type only for top level node (when context is `stylesheet`, that's by default)
+- Changed `Parentheses`, `Brackets` and `Function` consumers to use passed sequence reader instead of its own
+- Changed `Value` and `AtruleExpression` consumers to use common sequence reader (that reader was used by `Value` consumer before)
+- Changed default sequence reader to exclude storage of spaces around `Comma`
+- Changed processing of custom properties:
+ - Consume declaration value as balanced `Raw`
+ - Consume `var()` fallback value as balanced `Raw`
+ - Validate first argument of `var()` starts with double dash
+ - Custom property's value and fallback includes spaces around
+- Fixed `Nth` to have a `loc` property
+- Fixed `SelectorList.loc` and `Selector.loc` positions to exclude spaces
+- Fixed issue Browserify build fail with `default-syntax.json` is not found error (#32, @philschatz)
+- Disallowed `Type` selector starting with dash (parser throws an error in this case now)
+- Disallowed empty selectors for `Rule` (not sure if it's correct but looks reasonable)
+- Removed `>>` combinator support until any browser support (no signals about that yet)
+- Removed `PseudoElement.legacy` property
+- Removed special case for `:before`, `:after`, `:first-letter` and `:first-line` to represent them as `PseudoElement`, now those pseudos are represented as `PseudoClass` nodes
+- Removed deprecated `Syntax#match()` method
+- Parser was splitted into modules and related changes, one step closer to an extensible parser
+- Various fixes and improvements, all changes have negligible impact on performance
+
+## 1.0.0-alpha13 (January 19, 2017)
+
+- Changed location storing in `SyntaxMatchError`
+ - Changed property to store mismatch offset to `mismatchOffset`
+ - Changed `offset` property to store bad node offset in source CSS if any
+ - Added `loc` property that stores bad node `loc` if any
+
+## 1.0.0-alpha12 (January 19, 2017)
+
+- Fixed `Syntax#matchProperty()` method to always return a positive result for custom properties since syntax is never defined for them (#31)
+- Implemented `fromPlainObject()` and `toPlainObject()` to convert plain object to AST or AST to plain object (currently converts `List` <-> `Array`)
+
+## 1.0.0-alpha11 (January 18, 2017)
+
+- Added support for `:matches(<selector-list>)` (#28)
+- Added support for `:has(<relative-selector-list>)`
+- Added support for `::slotted(<compound-selector>)`
+- Implemented `Brackets` node type
+- Implemented basic support for at-rule inside rule block (#24)
+- Renamed `Selector` node type to `SelectorList`
+- Renamed `SimpleSelector` node type to `Selector`
+- Renamed `UnicodeRange.name` property to `UnicodeRange.value`
+- Replaced `Negation` node type for regular `PseudoClass`
+- Unified name of node property to store nested nodes, it always `children` now:
+ - `StyleSheet.rules` -> `StyleSheet.children`
+ - `SelectorList.selectors` -> `SelectorList.children`
+ - `Block.declarations` -> `Block.children`
+ - `*.sequence` -> `*.children`
+- Fixed edge cases in parsing `Hex` and `UnicodeRange` when number not an integer
+- Changed `nth-` pseudos parsing
+ - Implemented `An+B` node type to represent expressions like `2n + 1` or `-3n`
+ - Fixed edge cases when `a` or `b` is not an integer
+ - Changed `odd` and `even` keywords processing, keywords are storing as `Identifier` node type now
+ - Changed `Nth` node type format to store a `nth`-query and an optional `selector`
+ - Implemented `of` clause for `nth-` pseudos (a.e. `:nth-child(2n + 1 of li, img)`)
+ - Limited `Nth` parsing rules to `:nth-child()`, `:nth-last-child()`, `:nth-of-type()` and `:nth-last-of-type()` pseudos
+- Changed the way to store locations
+ - Renamed `info` node property to `loc`
+ - Changed format of `loc` to store `start` and `end` positions
+
+## 1.0.0-alpha10 (January 11, 2017)
+
+- Reworked `Scanner` to be a single point to its functionality
+- Exposed `Scanner` class to be useful for external projects
+- Changed `walk()` function behaviour to traverse AST nodes in natural order
+- Implemented `walkUp()` function to traverse AST nodes from deepest to parent (behaves as `walk()` before)
+
+## 1.0.0-alpha9 (December 21, 2016)
+
+- Fixed `<angle>` generic according to specs that allow a `<number>` equals to zero to be used as valid value (#30)
+
+## 1.0.0-alpha8 (November 11, 2016)
+
+- Fixed `Scanner#skip()` issue method when cursor is moving to the end of source
+- Simplified `Progid` node
+- Changed behaviour for bad selector processing, now parsing fails instead of selector ignoring
+- Fixed `<id-selector>` generic syntax
+- Added `q` unit for `<length>` generic syntax
+- Refactored syntax parser (performance)
+- Reduced startup time by implementing lazy syntax parsing (default syntax doesn't parse on module load)
+- Updated syntax dictionaries and used [`mdn/data`](https://github.com/mdn/data) instead of `Template:CSSData`
+- Renamed `syntax.stringify()` method to `syntax.translate()`
+- Simplified generic syntax functions, those functions receive a single AST node for checking and should return `true` or `false`
+- Added exception for values that contains `var()`, those values are always valid for now
+- Added more tests and increase code coverage to `98.5%`
+
+## 1.0.0-alpha7 (October 7, 2016)
+
+- Added support for explicit descendant combinator (`>>`)
+- Implemented `Type` and `Universal` type nodes
+- Improved `Number` parsing by including sign and exponent (#26)
+- Parse `before`, `after`, `first-letter` and `first-line` pseudos with single colon as `PseudoElement`
+- Changed `FunctionalPseudo` node type to `PseudoClass`
+- Fixed attribute selector name parsing (namespace edge cases)
+- Fixed location calculation for specified offset when `eof` is reached
+- Added more non-standard colors (#25)
+- Removed obsolete `Syntax#getAll()` method
+- Fixed various edge cases, code clean up and performance improvements
+
+## 1.0.0-alpha6 (September 23, 2016)
+
+- More accurate positions for syntax mismatch errors
+- Added [`apple`](https://webkit.org/blog/3709/using-the-system-font-in-web-content/) specific font keywords (#20)
+- Changed `Property` node stucture from object to string
+- Renamed `Ruleset` node type to `Rule`
+- Removed `Argument` node type
+- Fixed `Dimension` and `Percentage` position computation
+- Fixed bad selector parsing (temporary solution)
+- Fixed location computation for CSS with very long lines that may lead to really long parsing with `positions:true` (even freeze)
+- Fixed `line` and `column` computation for `SyntaxMatch` error
+- Improved performance of parsing and translation. Now CSSTree is under 10ms in [PostCSS benchmark](https://github.com/postcss/benchmark).
diff --git a/node_modules/csso/node_modules/css-tree/LICENSE b/node_modules/csso/node_modules/css-tree/LICENSE
new file mode 100644
index 0000000..bf9d7ce
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2016-2019 by Roman Dvornov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/node_modules/csso/node_modules/css-tree/README.md b/node_modules/csso/node_modules/css-tree/README.md
new file mode 100644
index 0000000..f69d14a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/README.md
@@ -0,0 +1,130 @@
+<img align="right" width="111" height="111"
+ alt="CSSTree logo"
+ src="https://cloud.githubusercontent.com/assets/270491/19243723/6f9136c6-8f21-11e6-82ac-eeeee4c6c452.png"/>
+
+# CSSTree
+
+[](https://www.npmjs.com/package/css-tree)
+[](https://travis-ci.org/csstree/csstree)
+[](https://coveralls.io/github/csstree/csstree?branch=master)
+[](https://www.npmjs.com/package/css-tree)
+[](https://twitter.com/csstree)
+
+CSSTree is a tool set for CSS: [fast](https://github.com/postcss/benchmark) detailed parser (CSS → AST), walker (AST traversal), generator (AST → CSS) and lexer (validation and matching) based on specs and browser implementations. The main goal is to be efficient and W3C specs compliant, with focus on CSS analyzing and source-to-source transforming tasks.
+
+> NOTE: The library isn't in final shape and needs further improvements (e.g. AST format and API are subjects to change in next major versions). However it's stable enough and used by projects like [CSSO](https://github.com/css/csso) (CSS minifier) and [SVGO](https://github.com/svg/svgo) (SVG optimizer) in production.
+
+## Features
+
+- **Detailed parsing with an adjustable level of detail**
+
+ By default CSSTree parses CSS as detailed as possible, i.e. each single logical part is representing with its own AST node (see [AST format](docs/ast.md) for all possible node types). The parsing detail level can be changed through [parser options](docs/parsing.md#parsesource-options), for example, you can disable parsing of selectors or declaration values for component parts.
+
+- **Tolerant to errors by design**
+
+ Parser behaves as [spec says](https://www.w3.org/TR/css-syntax-3/#error-handling): "When errors occur in CSS, the parser attempts to recover gracefully, throwing away only the minimum amount of content before returning to parsing as normal". The only thing the parser departs from the specification is that it doesn't throw away bad content, but wraps it in a special node type (`Raw`) that allows processing it later.
+
+- **Fast and efficient**
+
+ CSSTree is created with focus on performance and effective memory consumption. Therefore it's [one of the fastest CSS parsers](https://github.com/postcss/benchmark) at the moment.
+
+- **Syntax validation**
+
+ The build-in lexer can test CSS against syntaxes defined by W3C. CSSTree uses [mdn/data](https://github.com/mdn/data/) as a basis for lexer's dictionaries and extends it with vendor specific and legacy syntaxes. Lexer can only check the declaration values currently, but this feature will be extended to other parts of the CSS in the future.
+
+## Documentation
+
+- [AST format](docs/ast.md)
+- [Parsing CSS → AST](docs/parsing.md)
+ - [parse(source[, options])](docs/parsing.md#parsesource-options)
+- [Serialization AST → CSS](docs/generate.md)
+ - [generate(ast[, options])](docs/generate.md#generateast-options)
+- [AST traversal](docs/traversal.md)
+ - [walk(ast, options)](docs/traversal.md#walkast-options)
+ - [find(ast, fn)](docs/traversal.md#findast-fn)
+ - [findLast(ast, fn)](docs/traversal.md#findlastast-fn)
+ - [findAll(ast, fn)](docs/traversal.md#findallast-fn)
+- [Utils for AST](docs/utils.md)
+ - [property(name)](docs/utils.md#propertyname)
+ - [keyword(name)](docs/utils.md#keywordname)
+ - [clone(ast)](docs/utils.md#cloneast)
+ - [fromPlainObject(object)](docs/utils.md#fromplainobjectobject)
+ - [toPlainObject(ast)](docs/utils.md#toplainobjectast)
+- [Value Definition Syntax](docs/definition-syntax.md)
+ - [parse(source)](docs/definition-syntax.md#parsesource)
+ - [walk(node, options, context)](docs/definition-syntax.md#walknode-options-context)
+ - [generate(node, options)](docs/definition-syntax.md#generatenode-options)
+ - [AST format](docs/definition-syntax.md#ast-format)
+
+## Tools
+
+* [AST Explorer](https://astexplorer.net/#/gist/244e2fb4da940df52bf0f4b94277db44/e79aff44611020b22cfd9708f3a99ce09b7d67a8) – explore CSSTree AST format with zero setup
+* [CSS syntax reference](https://csstree.github.io/docs/syntax.html)
+* [CSS syntax validator](https://csstree.github.io/docs/validator.html)
+
+## Related projects
+
+* [csstree-validator](https://github.com/csstree/validator) – NPM package to validate CSS
+* [stylelint-csstree-validator](https://github.com/csstree/stylelint-validator) – plugin for stylelint to validate CSS
+* [Grunt plugin](https://github.com/sergejmueller/grunt-csstree-validator)
+* [Gulp plugin](https://github.com/csstree/gulp-csstree)
+* [Sublime plugin](https://github.com/csstree/SublimeLinter-contrib-csstree)
+* [VS Code plugin](https://github.com/csstree/vscode-plugin)
+* [Atom plugin](https://github.com/csstree/atom-plugin)
+
+## Usage
+
+Install with npm:
+
+```
+> npm install css-tree
+```
+
+Basic usage:
+
+```js
+var csstree = require('css-tree');
+
+// parse CSS to AST
+var ast = csstree.parse('.example { world: "!" }');
+
+// traverse AST and modify it
+csstree.walk(ast, function(node) {
+ if (node.type === 'ClassSelector' && node.name === 'example') {
+ node.name = 'hello';
+ }
+});
+
+// generate CSS from AST
+console.log(csstree.generate(ast));
+// .hello{world:"!"}
+```
+
+Syntax matching:
+
+```js
+// parse CSS to AST as a declaration value
+var ast = csstree.parse('red 1px solid', { context: 'value' });
+
+// match to syntax of `border` property
+var matchResult = csstree.lexer.matchProperty('border', ast);
+
+// check first value node is a <color>
+console.log(matchResult.isType(ast.children.first(), 'color'));
+// true
+
+// get a type list matched to a node
+console.log(matchResult.getTrace(ast.children.first()));
+// [ { type: 'Property', name: 'border' },
+// { type: 'Type', name: 'color' },
+// { type: 'Type', name: 'named-color' },
+// { type: 'Keyword', name: 'red' } ]
+```
+
+## Top level API
+
+
+
+## License
+
+MIT
diff --git a/node_modules/csso/node_modules/css-tree/data/index.js b/node_modules/csso/node_modules/css-tree/data/index.js
new file mode 100644
index 0000000..ff56c24
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/data/index.js
@@ -0,0 +1,103 @@
+const mdnAtrules = require('mdn-data/css/at-rules.json');
+const mdnProperties = require('mdn-data/css/properties.json');
+const mdnSyntaxes = require('mdn-data/css/syntaxes.json');
+const patch = require('./patch.json');
+const extendSyntax = /^\s*\|\s*/;
+
+function preprocessAtrules(dict) {
+ const result = Object.create(null);
+
+ for (const atruleName in dict) {
+ const atrule = dict[atruleName];
+ let descriptors = null;
+
+ if (atrule.descriptors) {
+ descriptors = Object.create(null);
+
+ for (const descriptor in atrule.descriptors) {
+ descriptors[descriptor] = atrule.descriptors[descriptor].syntax;
+ }
+ }
+
+ result[atruleName.substr(1)] = {
+ prelude: atrule.syntax.trim().match(/^@\S+\s+([^;\{]*)/)[1].trim() || null,
+ descriptors
+ };
+ }
+
+ return result;
+}
+
+function patchDictionary(dict, patchDict) {
+ const result = {};
+
+ // copy all syntaxes for an original dict
+ for (const key in dict) {
+ result[key] = dict[key].syntax || dict[key];
+ }
+
+ // apply a patch
+ for (const key in patchDict) {
+ if (key in dict) {
+ if (patchDict[key].syntax) {
+ result[key] = extendSyntax.test(patchDict[key].syntax)
+ ? result[key] + ' ' + patchDict[key].syntax.trim()
+ : patchDict[key].syntax;
+ } else {
+ delete result[key];
+ }
+ } else {
+ if (patchDict[key].syntax) {
+ result[key] = patchDict[key].syntax.replace(extendSyntax, '');
+ }
+ }
+ }
+
+ return result;
+}
+
+function unpackSyntaxes(dict) {
+ const result = {};
+
+ for (const key in dict) {
+ result[key] = dict[key].syntax;
+ }
+
+ return result;
+}
+
+function patchAtrules(dict, patchDict) {
+ const result = {};
+
+ // copy all syntaxes for an original dict
+ for (const key in dict) {
+ const patchDescriptors = (patchDict[key] && patchDict[key].descriptors) || null;
+
+ result[key] = {
+ prelude: key in patchDict && 'prelude' in patchDict[key]
+ ? patchDict[key].prelude
+ : dict[key].prelude || null,
+ descriptors: dict[key].descriptors
+ ? patchDictionary(dict[key].descriptors, patchDescriptors || {})
+ : patchDescriptors && unpackSyntaxes(patchDescriptors)
+ };
+ }
+
+ // apply a patch
+ for (const key in patchDict) {
+ if (!hasOwnProperty.call(dict, key)) {
+ result[key] = {
+ prelude: patchDict[key].prelude || null,
+ descriptors: patchDict[key].descriptors && unpackSyntaxes(patchDict[key].descriptors)
+ };
+ }
+ }
+
+ return result;
+}
+
+module.exports = {
+ types: patchDictionary(mdnSyntaxes, patch.syntaxes),
+ atrules: patchAtrules(preprocessAtrules(mdnAtrules), patch.atrules),
+ properties: patchDictionary(mdnProperties, patch.properties)
+};
diff --git a/node_modules/csso/node_modules/css-tree/data/patch.json b/node_modules/csso/node_modules/css-tree/data/patch.json
new file mode 100644
index 0000000..7a79050
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/data/patch.json
@@ -0,0 +1,717 @@
+{
+ "atrules": {
+ "charset": {
+ "prelude": "<string>"
+ },
+ "font-face": {
+ "descriptors": {
+ "unicode-range": {
+ "comment": "replaces <unicode-range>, an old production name",
+ "syntax": "<urange>#"
+ }
+ }
+ }
+ },
+ "properties": {
+ "-moz-background-clip": {
+ "comment": "deprecated syntax in old Firefox, https://developer.mozilla.org/en/docs/Web/CSS/background-clip",
+ "syntax": "padding | border"
+ },
+ "-moz-border-radius-bottomleft": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-left-radius",
+ "syntax": "<'border-bottom-left-radius'>"
+ },
+ "-moz-border-radius-bottomright": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",
+ "syntax": "<'border-bottom-right-radius'>"
+ },
+ "-moz-border-radius-topleft": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-top-left-radius",
+ "syntax": "<'border-top-left-radius'>"
+ },
+ "-moz-border-radius-topright": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/border-bottom-right-radius",
+ "syntax": "<'border-bottom-right-radius'>"
+ },
+ "-moz-control-character-visibility": {
+ "comment": "firefox specific keywords, https://bugzilla.mozilla.org/show_bug.cgi?id=947588",
+ "syntax": "visible | hidden"
+ },
+ "-moz-osx-font-smoothing": {
+ "comment": "misssed old syntax https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",
+ "syntax": "auto | grayscale"
+ },
+ "-moz-user-select": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",
+ "syntax": "none | text | all | -moz-none"
+ },
+ "-ms-flex-align": {
+ "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",
+ "syntax": "start | end | center | baseline | stretch"
+ },
+ "-ms-flex-item-align": {
+ "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-align",
+ "syntax": "auto | start | end | center | baseline | stretch"
+ },
+ "-ms-flex-line-pack": {
+ "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-line-pack",
+ "syntax": "start | end | center | justify | distribute | stretch"
+ },
+ "-ms-flex-negative": {
+ "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+ "syntax": "<'flex-shrink'>"
+ },
+ "-ms-flex-pack": {
+ "comment": "misssed old syntax implemented in IE, https://www.w3.org/TR/2012/WD-css3-flexbox-20120322/#flex-pack",
+ "syntax": "start | end | center | justify | distribute"
+ },
+ "-ms-flex-order": {
+ "comment": "misssed old syntax implemented in IE; https://msdn.microsoft.com/en-us/library/jj127303(v=vs.85).aspx",
+ "syntax": "<integer>"
+ },
+ "-ms-flex-positive": {
+ "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+ "syntax": "<'flex-grow'>"
+ },
+ "-ms-flex-preferred-size": {
+ "comment": "misssed old syntax implemented in IE; TODO: find references for comfirmation",
+ "syntax": "<'flex-basis'>"
+ },
+ "-ms-interpolation-mode": {
+ "comment": "https://msdn.microsoft.com/en-us/library/ff521095(v=vs.85).aspx",
+ "syntax": "nearest-neighbor | bicubic"
+ },
+ "-ms-grid-column-align": {
+ "comment": "add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466338.aspx",
+ "syntax": "start | end | center | stretch"
+ },
+ "-ms-grid-row-align": {
+ "comment": "add this property first since it uses as fallback for flexbox, https://msdn.microsoft.com/en-us/library/windows/apps/hh466348.aspx",
+ "syntax": "start | end | center | stretch"
+ },
+ "-ms-hyphenate-limit-last": {
+ "comment": "misssed old syntax implemented in IE; https://www.w3.org/TR/css-text-4/#hyphenate-line-limits",
+ "syntax": "none | always | column | page | spread"
+ },
+ "-webkit-appearance": {
+ "comment": "webkit specific keywords",
+ "references": [
+ "http://css-infos.net/property/-webkit-appearance"
+ ],
+ "syntax": "none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button"
+ },
+ "-webkit-background-clip": {
+ "comment": "https://developer.mozilla.org/en/docs/Web/CSS/background-clip",
+ "syntax": "[ <box> | border | padding | content | text ]#"
+ },
+ "-webkit-column-break-after": {
+ "comment": "added, http://help.dottoro.com/lcrthhhv.php",
+ "syntax": "always | auto | avoid"
+ },
+ "-webkit-column-break-before": {
+ "comment": "added, http://help.dottoro.com/lcxquvkf.php",
+ "syntax": "always | auto | avoid"
+ },
+ "-webkit-column-break-inside": {
+ "comment": "added, http://help.dottoro.com/lclhnthl.php",
+ "syntax": "always | auto | avoid"
+ },
+ "-webkit-font-smoothing": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth",
+ "syntax": "auto | none | antialiased | subpixel-antialiased"
+ },
+ "-webkit-mask-box-image": {
+ "comment": "missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",
+ "syntax": "[ <url> | <gradient> | none ] [ <length-percentage>{4} <-webkit-mask-box-repeat>{2} ]?"
+ },
+ "-webkit-print-color-adjust": {
+ "comment": "missed",
+ "references": [
+ "https://developer.mozilla.org/en/docs/Web/CSS/-webkit-print-color-adjust"
+ ],
+ "syntax": "economy | exact"
+ },
+ "-webkit-text-security": {
+ "comment": "missed; http://help.dottoro.com/lcbkewgt.php",
+ "syntax": "none | circle | disc | square"
+ },
+ "-webkit-user-drag": {
+ "comment": "missed; http://help.dottoro.com/lcbixvwm.php",
+ "syntax": "none | element | auto"
+ },
+ "-webkit-user-select": {
+ "comment": "auto is supported by old webkit, https://developer.mozilla.org/en-US/docs/Web/CSS/user-select",
+ "syntax": "auto | none | text | all"
+ },
+ "alignment-baseline": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#AlignmentBaselineProperty"
+ ],
+ "syntax": "auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical"
+ },
+ "baseline-shift": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#BaselineShiftProperty"
+ ],
+ "syntax": "baseline | sub | super | <svg-length>"
+ },
+ "behavior": {
+ "comment": "added old IE property https://msdn.microsoft.com/en-us/library/ms530723(v=vs.85).aspx",
+ "syntax": "<url>+"
+ },
+ "clip-rule": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/masking.html#ClipRuleProperty"
+ ],
+ "syntax": "nonzero | evenodd"
+ },
+ "cue": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<'cue-before'> <'cue-after'>?"
+ },
+ "cue-after": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<url> <decibel>? | none"
+ },
+ "cue-before": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<url> <decibel>? | none"
+ },
+ "cursor": {
+ "comment": "added legacy keywords: hand, -webkit-grab. -webkit-grabbing, -webkit-zoom-in, -webkit-zoom-out, -moz-grab, -moz-grabbing, -moz-zoom-in, -moz-zoom-out",
+ "references": [
+ "https://www.sitepoint.com/css3-cursor-styles/"
+ ],
+ "syntax": "[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing | hand | -webkit-grab | -webkit-grabbing | -webkit-zoom-in | -webkit-zoom-out | -moz-grab | -moz-grabbing | -moz-zoom-in | -moz-zoom-out ] ]"
+ },
+ "display": {
+ "comment": "extended with -ms-flexbox",
+ "syntax": "| <-non-standard-display>"
+ },
+ "position": {
+ "comment": "extended with -webkit-sticky",
+ "syntax": "| -webkit-sticky"
+ },
+ "dominant-baseline": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#DominantBaselineProperty"
+ ],
+ "syntax": "auto | use-script | no-change | reset-size | ideographic | alphabetic | hanging | mathematical | central | middle | text-after-edge | text-before-edge"
+ },
+ "image-rendering": {
+ "comment": "extended with <-non-standard-image-rendering>, added SVG keywords optimizeSpeed and optimizeQuality",
+ "references": [
+ "https://developer.mozilla.org/en/docs/Web/CSS/image-rendering",
+ "https://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty"
+ ],
+ "syntax": "| optimizeSpeed | optimizeQuality | <-non-standard-image-rendering>"
+ },
+ "fill": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+ ],
+ "syntax": "<paint>"
+ },
+ "fill-opacity": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+ ],
+ "syntax": "<number-zero-one>"
+ },
+ "fill-rule": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#FillProperty"
+ ],
+ "syntax": "nonzero | evenodd"
+ },
+ "filter": {
+ "comment": "extend with IE legacy syntaxes",
+ "syntax": "| <-ms-filter-function-list>"
+ },
+ "glyph-orientation-horizontal": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#GlyphOrientationHorizontalProperty"
+ ],
+ "syntax": "<angle>"
+ },
+ "glyph-orientation-vertical": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#GlyphOrientationVerticalProperty"
+ ],
+ "syntax": "<angle>"
+ },
+ "kerning": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#KerningProperty"
+ ],
+ "syntax": "auto | <svg-length>"
+ },
+ "letter-spacing": {
+ "comment": "fix syntax <length> -> <length-percentage>",
+ "references": [
+ "https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/letter-spacing"
+ ],
+ "syntax": "normal | <length-percentage>"
+ },
+ "marker": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+ ],
+ "syntax": "none | <url>"
+ },
+ "marker-end": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+ ],
+ "syntax": "none | <url>"
+ },
+ "marker-mid": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+ ],
+ "syntax": "none | <url>"
+ },
+ "marker-start": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#MarkerProperties"
+ ],
+ "syntax": "none | <url>"
+ },
+ "max-width": {
+ "comment": "fix auto -> none (https://github.com/mdn/data/pull/431); extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/max-width",
+ "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) | <-non-standard-width>"
+ },
+ "min-width": {
+ "comment": "extend by non-standard width keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+ "syntax": "auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) | <-non-standard-width>"
+ },
+ "overflow": {
+ "comment": "extend by vendor keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
+ "syntax": "| <-non-standard-overflow>"
+ },
+ "pause": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<'pause-before'> <'pause-after'>?"
+ },
+ "pause-after": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+ },
+ "pause-before": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+ },
+ "rest": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<'rest-before'> <'rest-after'>?"
+ },
+ "rest-after": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+ },
+ "rest-before": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<time> | none | x-weak | weak | medium | strong | x-strong"
+ },
+ "shape-rendering": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#ShapeRenderingPropert"
+ ],
+ "syntax": "auto | optimizeSpeed | crispEdges | geometricPrecision"
+ },
+ "src": {
+ "comment": "added @font-face's src property https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src",
+ "syntax": "[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#"
+ },
+ "speak": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "auto | none | normal"
+ },
+ "speak-as": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "normal | spell-out || digits || [ literal-punctuation | no-punctuation ]"
+ },
+ "stroke": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "<paint>"
+ },
+ "stroke-dasharray": {
+ "comment": "added SVG property; a list of comma and/or white space separated <length>s and <percentage>s",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "none | [ <svg-length>+ ]#"
+ },
+ "stroke-dashoffset": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "<svg-length>"
+ },
+ "stroke-linecap": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "butt | round | square"
+ },
+ "stroke-linejoin": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "miter | round | bevel"
+ },
+ "stroke-miterlimit": {
+ "comment": "added SVG property (<miterlimit> = <number-one-or-greater>) ",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "<number-one-or-greater>"
+ },
+ "stroke-opacity": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "<number-zero-one>"
+ },
+ "stroke-width": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/painting.html#StrokeProperties"
+ ],
+ "syntax": "<svg-length>"
+ },
+ "text-anchor": {
+ "comment": "added SVG property",
+ "references": [
+ "https://www.w3.org/TR/SVG/text.html#TextAlignmentProperties"
+ ],
+ "syntax": "start | middle | end"
+ },
+ "unicode-bidi": {
+ "comment": "added prefixed keywords https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi",
+ "syntax": "| -moz-isolate | -moz-isolate-override | -moz-plaintext | -webkit-isolate | -webkit-isolate-override | -webkit-plaintext"
+ },
+ "unicode-range": {
+ "comment": "added missed property https://developer.mozilla.org/en-US/docs/Web/CSS/%40font-face/unicode-range",
+ "syntax": "<urange>#"
+ },
+ "voice-balance": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<number> | left | center | right | leftwards | rightwards"
+ },
+ "voice-duration": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "auto | <time>"
+ },
+ "voice-family": {
+ "comment": "<name> -> <family-name>, https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "[ [ <family-name> | <generic-voice> ] , ]* [ <family-name> | <generic-voice> ] | preserve"
+ },
+ "voice-pitch": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]"
+ },
+ "voice-range": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "<frequency> && absolute | [ [ x-low | low | medium | high | x-high ] || [ <frequency> | <semitones> | <percentage> ] ]"
+ },
+ "voice-rate": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "[ normal | x-slow | slow | medium | fast | x-fast ] || <percentage>"
+ },
+ "voice-stress": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "normal | strong | moderate | none | reduced"
+ },
+ "voice-volume": {
+ "comment": "https://www.w3.org/TR/css3-speech/#property-index",
+ "syntax": "silent | [ [ x-soft | soft | medium | loud | x-loud ] || <decibel> ]"
+ },
+ "writing-mode": {
+ "comment": "extend with SVG keywords",
+ "syntax": "| <svg-writing-mode>"
+ }
+ },
+ "syntaxes": {
+ "-legacy-gradient": {
+ "comment": "added collection of legacy gradient syntaxes",
+ "syntax": "<-webkit-gradient()> | <-legacy-linear-gradient> | <-legacy-repeating-linear-gradient> | <-legacy-radial-gradient> | <-legacy-repeating-radial-gradient>"
+ },
+ "-legacy-linear-gradient": {
+ "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+ "syntax": "-moz-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-linear-gradient( <-legacy-linear-gradient-arguments> )"
+ },
+ "-legacy-repeating-linear-gradient": {
+ "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+ "syntax": "-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> ) | -o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )"
+ },
+ "-legacy-linear-gradient-arguments": {
+ "comment": "like standard syntax but w/o `to` keyword https://developer.mozilla.org/en-US/docs/Web/CSS/linear-gradient",
+ "syntax": "[ <angle> | <side-or-corner> ]? , <color-stop-list>"
+ },
+ "-legacy-radial-gradient": {
+ "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+ "syntax": "-moz-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-radial-gradient( <-legacy-radial-gradient-arguments> )"
+ },
+ "-legacy-repeating-radial-gradient": {
+ "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+ "syntax": "-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> ) | -o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )"
+ },
+ "-legacy-radial-gradient-arguments": {
+ "comment": "deprecated syntax that implemented by some browsers https://www.w3.org/TR/2011/WD-css3-images-20110908/#radial-gradients",
+ "syntax": "[ <position> , ]? [ [ [ <-legacy-radial-gradient-shape> || <-legacy-radial-gradient-size> ] | [ <length> | <percentage> ]{2} ] , ]? <color-stop-list>"
+ },
+ "-legacy-radial-gradient-size": {
+ "comment": "before a standard it contains 2 extra keywords (`contain` and `cover`) https://www.w3.org/TR/2011/WD-css3-images-20110908/#ltsize",
+ "syntax": "closest-side | closest-corner | farthest-side | farthest-corner | contain | cover"
+ },
+ "-legacy-radial-gradient-shape": {
+ "comment": "define to double sure it doesn't extends in future https://www.w3.org/TR/2011/WD-css3-images-20110908/#ltshape",
+ "syntax": "circle | ellipse"
+ },
+ "-non-standard-font": {
+ "comment": "non standard fonts",
+ "references": [
+ "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
+ ],
+ "syntax": "-apple-system-body | -apple-system-headline | -apple-system-subheadline | -apple-system-caption1 | -apple-system-caption2 | -apple-system-footnote | -apple-system-short-body | -apple-system-short-headline | -apple-system-short-subheadline | -apple-system-short-caption1 | -apple-system-short-footnote | -apple-system-tall-body"
+ },
+ "-non-standard-color": {
+ "comment": "non standard colors",
+ "references": [
+ "http://cssdot.ru/%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_CSS/color-i305.html",
+ "https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Mozilla_Color_Preference_Extensions"
+ ],
+ "syntax": "-moz-ButtonDefault | -moz-ButtonHoverFace | -moz-ButtonHoverText | -moz-CellHighlight | -moz-CellHighlightText | -moz-Combobox | -moz-ComboboxText | -moz-Dialog | -moz-DialogText | -moz-dragtargetzone | -moz-EvenTreeRow | -moz-Field | -moz-FieldText | -moz-html-CellHighlight | -moz-html-CellHighlightText | -moz-mac-accentdarkestshadow | -moz-mac-accentdarkshadow | -moz-mac-accentface | -moz-mac-accentlightesthighlight | -moz-mac-accentlightshadow | -moz-mac-accentregularhighlight | -moz-mac-accentregularshadow | -moz-mac-chrome-active | -moz-mac-chrome-inactive | -moz-mac-focusring | -moz-mac-menuselect | -moz-mac-menushadow | -moz-mac-menutextselect | -moz-MenuHover | -moz-MenuHoverText | -moz-MenuBarText | -moz-MenuBarHoverText | -moz-nativehyperlinktext | -moz-OddTreeRow | -moz-win-communicationstext | -moz-win-mediatext | -moz-activehyperlinktext | -moz-default-background-color | -moz-default-color | -moz-hyperlinktext | -moz-visitedhyperlinktext | -webkit-activelink | -webkit-focus-ring-color | -webkit-link | -webkit-text"
+ },
+ "-non-standard-image-rendering": {
+ "comment": "non-standard keywords http://phrogz.net/tmp/canvas_image_zoom.html",
+ "syntax": "optimize-contrast | -moz-crisp-edges | -o-crisp-edges | -webkit-optimize-contrast"
+ },
+ "-non-standard-overflow": {
+ "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/overflow",
+ "syntax": "-moz-scrollbars-none | -moz-scrollbars-horizontal | -moz-scrollbars-vertical | -moz-hidden-unscrollable"
+ },
+ "-non-standard-width": {
+ "comment": "non-standard keywords https://developer.mozilla.org/en-US/docs/Web/CSS/width",
+ "syntax": "fill-available | min-intrinsic | intrinsic | -moz-available | -moz-fit-content | -moz-min-content | -moz-max-content | -webkit-min-content | -webkit-max-content"
+ },
+ "-webkit-gradient()": {
+ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/ - TODO: simplify when after match algorithm improvement ( [, point, radius | , point] -> [, radius]? , point )",
+ "syntax": "-webkit-gradient( <-webkit-gradient-type>, <-webkit-gradient-point> [, <-webkit-gradient-point> | , <-webkit-gradient-radius>, <-webkit-gradient-point> ] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )"
+ },
+ "-webkit-gradient-color-stop": {
+ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+ "syntax": "from( <color> ) | color-stop( [ <number-zero-one> | <percentage> ] , <color> ) | to( <color> )"
+ },
+ "-webkit-gradient-point": {
+ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+ "syntax": "[ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]"
+ },
+ "-webkit-gradient-radius": {
+ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+ "syntax": "<length> | <percentage>"
+ },
+ "-webkit-gradient-type": {
+ "comment": "first Apple proposal gradient syntax https://webkit.org/blog/175/introducing-css-gradients/",
+ "syntax": "linear | radial"
+ },
+ "-webkit-mask-box-repeat": {
+ "comment": "missed; https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-mask-box-image",
+ "syntax": "repeat | stretch | round"
+ },
+ "-webkit-mask-clip-style": {
+ "comment": "missed; there is no enough information about `-webkit-mask-clip` property, but looks like all those keywords are working",
+ "syntax": "border | border-box | padding | padding-box | content | content-box | text"
+ },
+ "-ms-filter-function-list": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+ "syntax": "<-ms-filter-function>+"
+ },
+ "-ms-filter-function": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+ "syntax": "<-ms-filter-function-progid> | <-ms-filter-function-legacy>"
+ },
+ "-ms-filter-function-progid": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+ "syntax": "'progid:' [ <ident-token> '.' ]* [ <ident-token> | <function-token> <any-value>? ) ]"
+ },
+ "-ms-filter-function-legacy": {
+ "comment": "https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-filter",
+ "syntax": "<ident-token> | <function-token> <any-value>? )"
+ },
+ "-ms-filter": {
+ "syntax": "<string>"
+ },
+ "age": {
+ "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+ "syntax": "child | young | old"
+ },
+ "attr-name": {
+ "syntax": "<wq-name>"
+ },
+ "attr-fallback": {
+ "syntax": "<any-value>"
+ },
+ "border-radius": {
+ "comment": "missed, https://drafts.csswg.org/css-backgrounds-3/#the-border-radius",
+ "syntax": "<length-percentage>{1,2}"
+ },
+ "bottom": {
+ "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+ "syntax": "<length> | auto"
+ },
+ "content-list": {
+ "comment": "missed -> https://drafts.csswg.org/css-content/#typedef-content-list (document-url, <target> and leader() is omitted util stabilization)",
+ "syntax": "[ <string> | contents | <image> | <quote> | <target> | <leader()> | <attr()> | counter( <ident>, <'list-style-type'>? ) ]+"
+ },
+ "element()": {
+ "comment": "https://drafts.csswg.org/css-gcpm/#element-syntax & https://drafts.csswg.org/css-images-4/#element-notation",
+ "syntax": "element( <custom-ident> , [ first | start | last | first-except ]? ) | element( <id-selector> )"
+ },
+ "generic-voice": {
+ "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+ "syntax": "[ <age>? <gender> <integer>? ]"
+ },
+ "gender": {
+ "comment": "https://www.w3.org/TR/css3-speech/#voice-family",
+ "syntax": "male | female | neutral"
+ },
+ "generic-family": {
+ "comment": "added -apple-system",
+ "references": [
+ "https://webkit.org/blog/3709/using-the-system-font-in-web-content/"
+ ],
+ "syntax": "| -apple-system"
+ },
+ "gradient": {
+ "comment": "added legacy syntaxes support",
+ "syntax": "| <-legacy-gradient>"
+ },
+ "left": {
+ "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+ "syntax": "<length> | auto"
+ },
+ "mask-image": {
+ "comment": "missed; https://drafts.fxtf.org/css-masking-1/#the-mask-image",
+ "syntax": "<mask-reference>#"
+ },
+ "name-repeat": {
+ "comment": "missed, and looks like obsolete, keep it as is since other property syntaxes should be changed too; https://www.w3.org/TR/2015/WD-css-grid-1-20150917/#typedef-name-repeat",
+ "syntax": "repeat( [ <positive-integer> | auto-fill ], <line-names>+)"
+ },
+ "named-color": {
+ "comment": "added non standard color names",
+ "syntax": "| <-non-standard-color>"
+ },
+ "paint": {
+ "comment": "used by SVG https://www.w3.org/TR/SVG/painting.html#SpecifyingPaint",
+ "syntax": "none | <color> | <url> [ none | <color> ]? | context-fill | context-stroke"
+ },
+ "page-size": {
+ "comment": "https://www.w3.org/TR/css-page-3/#typedef-page-size-page-size",
+ "syntax": "A5 | A4 | A3 | B5 | B4 | JIS-B5 | JIS-B4 | letter | legal | ledger"
+ },
+ "ratio": {
+ "comment": "missed, https://drafts.csswg.org/mediaqueries-4/#typedef-ratio",
+ "syntax": "<integer> / <integer>"
+ },
+ "right": {
+ "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+ "syntax": "<length> | auto"
+ },
+ "shape": {
+ "comment": "missed spaces in function body and add backwards compatible syntax",
+ "syntax": "rect( <top>, <right>, <bottom>, <left> ) | rect( <top> <right> <bottom> <left> )"
+ },
+ "svg-length": {
+ "comment": "All coordinates and lengths in SVG can be specified with or without a unit identifier",
+ "references": [
+ "https://www.w3.org/TR/SVG11/coords.html#Units"
+ ],
+ "syntax": "<percentage> | <length> | <number>"
+ },
+ "svg-writing-mode": {
+ "comment": "SVG specific keywords (deprecated for CSS)",
+ "references": [
+ "https://developer.mozilla.org/en/docs/Web/CSS/writing-mode",
+ "https://www.w3.org/TR/SVG/text.html#WritingModeProperty"
+ ],
+ "syntax": "lr-tb | rl-tb | tb-rl | lr | rl | tb"
+ },
+ "top": {
+ "comment": "missed; not sure we should add it, but no others except `shape` is using it so it's ok for now; https://drafts.fxtf.org/css-masking-1/#funcdef-clip-rect",
+ "syntax": "<length> | auto"
+ },
+ "track-group": {
+ "comment": "used by old grid-columns and grid-rows syntax v0",
+ "syntax": "'(' [ <string>* <track-minmax> <string>* ]+ ')' [ '[' <positive-integer> ']' ]? | <track-minmax>"
+ },
+ "track-list-v0": {
+ "comment": "used by old grid-columns and grid-rows syntax v0",
+ "syntax": "[ <string>* <track-group> <string>* ]+ | none"
+ },
+ "track-minmax": {
+ "comment": "used by old grid-columns and grid-rows syntax v0",
+ "syntax": "minmax( <track-breadth> , <track-breadth> ) | auto | <track-breadth> | fit-content"
+ },
+ "x": {
+ "comment": "missed; not sure we should add it, but no others except `cursor` is using it so it's ok for now; https://drafts.csswg.org/css-ui-3/#cursor",
+ "syntax": "<number>"
+ },
+ "y": {
+ "comment": "missed; not sure we should add it, but no others except `cursor` is using so it's ok for now; https://drafts.csswg.org/css-ui-3/#cursor",
+ "syntax": "<number>"
+ },
+ "declaration": {
+ "comment": "missed, restored by https://drafts.csswg.org/css-syntax",
+ "syntax": "<ident-token> : <declaration-value>? [ '!' important ]?"
+ },
+ "declaration-list": {
+ "comment": "missed, restored by https://drafts.csswg.org/css-syntax",
+ "syntax": "[ <declaration>? ';' ]* <declaration>?"
+ },
+ "url": {
+ "comment": "https://drafts.csswg.org/css-values-4/#urls",
+ "syntax": "url( <string> <url-modifier>* ) | <url-token>"
+ },
+ "url-modifier": {
+ "comment": "https://drafts.csswg.org/css-values-4/#typedef-url-modifier",
+ "syntax": "<ident> | <function-token> <any-value> )"
+ },
+ "number-zero-one": {
+ "syntax": "<number [0,1]>"
+ },
+ "number-one-or-greater": {
+ "syntax": "<number [1,∞]>"
+ },
+ "positive-integer": {
+ "syntax": "<integer [0,∞]>"
+ },
+ "-non-standard-display": {
+ "syntax": "-ms-inline-flexbox | -ms-grid | -ms-inline-grid | -webkit-flex | -webkit-inline-flex | -webkit-box | -webkit-inline-box | -moz-inline-stack | -moz-box | -moz-inline-box"
+ }
+ }
+}
diff --git a/node_modules/csso/node_modules/css-tree/dist/csstree.js b/node_modules/csso/node_modules/css-tree/dist/csstree.js
new file mode 100644
index 0000000..4a72451
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/dist/csstree.js
@@ -0,0 +1,12606 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = global || self, global.csstree = factory());
+}(this, (function () { 'use strict';
+
+ //
+ // list
+ // āāāāāāāā
+ // āāāāāāāāāāāāāāāā¼āhead ā
+ // ā ā tailāā¼āāāāāāāāāāāāāāā
+ // ā āāāāāāāā ā
+ // ā¼ ā¼
+ // item item item item
+ // āāāāāāāā āāāāāāāā āāāāāāāā āāāāāāāā
+ // null āāāā¼āprev āāāāāā¼āprev āāāāāā¼āprev āāāāāā¼āprev ā
+ // ā nextāā¼āāāā¶ā nextāā¼āāāā¶ā nextāā¼āāāā¶ā nextāā¼āāā¶ null
+ // āāāāāāā⤠āāāāāāā⤠āāāāāāā⤠āāāāāāāā¤
+ // ā data ā ā data ā ā data ā ā data ā
+ // āāāāāāāā āāāāāāāā āāāāāāāā āāāāāāāā
+ //
+
+ function createItem(data) {
+ return {
+ prev: null,
+ next: null,
+ data: data
+ };
+ }
+
+ function allocateCursor(node, prev, next) {
+ var cursor;
+
+ if (cursors !== null) {
+ cursor = cursors;
+ cursors = cursors.cursor;
+ cursor.prev = prev;
+ cursor.next = next;
+ cursor.cursor = node.cursor;
+ } else {
+ cursor = {
+ prev: prev,
+ next: next,
+ cursor: node.cursor
+ };
+ }
+
+ node.cursor = cursor;
+
+ return cursor;
+ }
+
+ function releaseCursor(node) {
+ var cursor = node.cursor;
+
+ node.cursor = cursor.cursor;
+ cursor.prev = null;
+ cursor.next = null;
+ cursor.cursor = cursors;
+ cursors = cursor;
+ }
+
+ var cursors = null;
+ var List = function() {
+ this.cursor = null;
+ this.head = null;
+ this.tail = null;
+ };
+
+ List.createItem = createItem;
+ List.prototype.createItem = createItem;
+
+ List.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {
+ var cursor = this.cursor;
+
+ while (cursor !== null) {
+ if (cursor.prev === prevOld) {
+ cursor.prev = prevNew;
+ }
+
+ if (cursor.next === nextOld) {
+ cursor.next = nextNew;
+ }
+
+ cursor = cursor.cursor;
+ }
+ };
+
+ List.prototype.getSize = function() {
+ var size = 0;
+ var cursor = this.head;
+
+ while (cursor) {
+ size++;
+ cursor = cursor.next;
+ }
+
+ return size;
+ };
+
+ List.prototype.fromArray = function(array) {
+ var cursor = null;
+
+ this.head = null;
+
+ for (var i = 0; i < array.length; i++) {
+ var item = createItem(array[i]);
+
+ if (cursor !== null) {
+ cursor.next = item;
+ } else {
+ this.head = item;
+ }
+
+ item.prev = cursor;
+ cursor = item;
+ }
+
+ this.tail = cursor;
+
+ return this;
+ };
+
+ List.prototype.toArray = function() {
+ var cursor = this.head;
+ var result = [];
+
+ while (cursor) {
+ result.push(cursor.data);
+ cursor = cursor.next;
+ }
+
+ return result;
+ };
+
+ List.prototype.toJSON = List.prototype.toArray;
+
+ List.prototype.isEmpty = function() {
+ return this.head === null;
+ };
+
+ List.prototype.first = function() {
+ return this.head && this.head.data;
+ };
+
+ List.prototype.last = function() {
+ return this.tail && this.tail.data;
+ };
+
+ List.prototype.each = function(fn, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, this.head);
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ fn.call(context, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+ };
+
+ List.prototype.forEach = List.prototype.each;
+
+ List.prototype.eachRight = function(fn, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, this.tail, null);
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ fn.call(context, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+ };
+
+ List.prototype.forEachRight = List.prototype.eachRight;
+
+ List.prototype.reduce = function(fn, initialValue, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, this.head);
+ var acc = initialValue;
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ acc = fn.call(context, acc, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+
+ return acc;
+ };
+
+ List.prototype.reduceRight = function(fn, initialValue, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, this.tail, null);
+ var acc = initialValue;
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ acc = fn.call(context, acc, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+
+ return acc;
+ };
+
+ List.prototype.nextUntil = function(start, fn, context) {
+ if (start === null) {
+ return;
+ }
+
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, start);
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ if (fn.call(context, item.data, item, this)) {
+ break;
+ }
+ }
+
+ // pop cursor
+ releaseCursor(this);
+ };
+
+ List.prototype.prevUntil = function(start, fn, context) {
+ if (start === null) {
+ return;
+ }
+
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, start, null);
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ if (fn.call(context, item.data, item, this)) {
+ break;
+ }
+ }
+
+ // pop cursor
+ releaseCursor(this);
+ };
+
+ List.prototype.some = function(fn, context) {
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ if (fn.call(context, cursor.data, cursor, this)) {
+ return true;
+ }
+
+ cursor = cursor.next;
+ }
+
+ return false;
+ };
+
+ List.prototype.map = function(fn, context) {
+ var result = new List();
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ result.appendData(fn.call(context, cursor.data, cursor, this));
+ cursor = cursor.next;
+ }
+
+ return result;
+ };
+
+ List.prototype.filter = function(fn, context) {
+ var result = new List();
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ if (fn.call(context, cursor.data, cursor, this)) {
+ result.appendData(cursor.data);
+ }
+ cursor = cursor.next;
+ }
+
+ return result;
+ };
+
+ List.prototype.clear = function() {
+ this.head = null;
+ this.tail = null;
+ };
+
+ List.prototype.copy = function() {
+ var result = new List();
+ var cursor = this.head;
+
+ while (cursor !== null) {
+ result.insert(createItem(cursor.data));
+ cursor = cursor.next;
+ }
+
+ return result;
+ };
+
+ List.prototype.prepend = function(item) {
+ // head
+ // ^
+ // item
+ this.updateCursors(null, item, this.head, item);
+
+ // insert to the beginning of the list
+ if (this.head !== null) {
+ // new item <- first item
+ this.head.prev = item;
+
+ // new item -> first item
+ item.next = this.head;
+ } else {
+ // if list has no head, then it also has no tail
+ // in this case tail points to the new item
+ this.tail = item;
+ }
+
+ // head always points to new item
+ this.head = item;
+
+ return this;
+ };
+
+ List.prototype.prependData = function(data) {
+ return this.prepend(createItem(data));
+ };
+
+ List.prototype.append = function(item) {
+ return this.insert(item);
+ };
+
+ List.prototype.appendData = function(data) {
+ return this.insert(createItem(data));
+ };
+
+ List.prototype.insert = function(item, before) {
+ if (before !== undefined && before !== null) {
+ // prev before
+ // ^
+ // item
+ this.updateCursors(before.prev, item, before, item);
+
+ if (before.prev === null) {
+ // insert to the beginning of list
+ if (this.head !== before) {
+ throw new Error('before doesn\'t belong to list');
+ }
+
+ // since head points to before therefore list doesn't empty
+ // no need to check tail
+ this.head = item;
+ before.prev = item;
+ item.next = before;
+
+ this.updateCursors(null, item);
+ } else {
+
+ // insert between two items
+ before.prev.next = item;
+ item.prev = before.prev;
+
+ before.prev = item;
+ item.next = before;
+ }
+ } else {
+ // tail
+ // ^
+ // item
+ this.updateCursors(this.tail, item, null, item);
+
+ // insert to the ending of the list
+ if (this.tail !== null) {
+ // last item -> new item
+ this.tail.next = item;
+
+ // last item <- new item
+ item.prev = this.tail;
+ } else {
+ // if list has no tail, then it also has no head
+ // in this case head points to new item
+ this.head = item;
+ }
+
+ // tail always points to new item
+ this.tail = item;
+ }
+
+ return this;
+ };
+
+ List.prototype.insertData = function(data, before) {
+ return this.insert(createItem(data), before);
+ };
+
+ List.prototype.remove = function(item) {
+ // item
+ // ^
+ // prev next
+ this.updateCursors(item, item.prev, item, item.next);
+
+ if (item.prev !== null) {
+ item.prev.next = item.next;
+ } else {
+ if (this.head !== item) {
+ throw new Error('item doesn\'t belong to list');
+ }
+
+ this.head = item.next;
+ }
+
+ if (item.next !== null) {
+ item.next.prev = item.prev;
+ } else {
+ if (this.tail !== item) {
+ throw new Error('item doesn\'t belong to list');
+ }
+
+ this.tail = item.prev;
+ }
+
+ item.prev = null;
+ item.next = null;
+
+ return item;
+ };
+
+ List.prototype.push = function(data) {
+ this.insert(createItem(data));
+ };
+
+ List.prototype.pop = function() {
+ if (this.tail !== null) {
+ return this.remove(this.tail);
+ }
+ };
+
+ List.prototype.unshift = function(data) {
+ this.prepend(createItem(data));
+ };
+
+ List.prototype.shift = function() {
+ if (this.head !== null) {
+ return this.remove(this.head);
+ }
+ };
+
+ List.prototype.prependList = function(list) {
+ return this.insertList(list, this.head);
+ };
+
+ List.prototype.appendList = function(list) {
+ return this.insertList(list);
+ };
+
+ List.prototype.insertList = function(list, before) {
+ // ignore empty lists
+ if (list.head === null) {
+ return this;
+ }
+
+ if (before !== undefined && before !== null) {
+ this.updateCursors(before.prev, list.tail, before, list.head);
+
+ // insert in the middle of dist list
+ if (before.prev !== null) {
+ // before.prev <-> list.head
+ before.prev.next = list.head;
+ list.head.prev = before.prev;
+ } else {
+ this.head = list.head;
+ }
+
+ before.prev = list.tail;
+ list.tail.next = before;
+ } else {
+ this.updateCursors(this.tail, list.tail, null, list.head);
+
+ // insert to end of the list
+ if (this.tail !== null) {
+ // if destination list has a tail, then it also has a head,
+ // but head doesn't change
+
+ // dest tail -> source head
+ this.tail.next = list.head;
+
+ // dest tail <- source head
+ list.head.prev = this.tail;
+ } else {
+ // if list has no a tail, then it also has no a head
+ // in this case points head to new item
+ this.head = list.head;
+ }
+
+ // tail always start point to new item
+ this.tail = list.tail;
+ }
+
+ list.head = null;
+ list.tail = null;
+
+ return this;
+ };
+
+ List.prototype.replace = function(oldItem, newItemOrList) {
+ if ('head' in newItemOrList) {
+ this.insertList(newItemOrList, oldItem);
+ } else {
+ this.insert(newItemOrList, oldItem);
+ }
+
+ this.remove(oldItem);
+ };
+
+ var List_1 = List;
+
+ var createCustomError = function createCustomError(name, message) {
+ // use Object.create(), because some VMs prevent setting line/column otherwise
+ // (iOS Safari 10 even throws an exception)
+ var error = Object.create(SyntaxError.prototype);
+ var errorStack = new Error();
+
+ error.name = name;
+ error.message = message;
+
+ Object.defineProperty(error, 'stack', {
+ get: function() {
+ return (errorStack.stack || '').replace(/^(.+\n){1,3}/, name + ': ' + message + '\n');
+ }
+ });
+
+ return error;
+ };
+
+ var MAX_LINE_LENGTH = 100;
+ var OFFSET_CORRECTION = 60;
+ var TAB_REPLACEMENT = ' ';
+
+ function sourceFragment(error, extraLines) {
+ function processLines(start, end) {
+ return lines.slice(start, end).map(function(line, idx) {
+ var num = String(start + idx + 1);
+
+ while (num.length < maxNumLength) {
+ num = ' ' + num;
+ }
+
+ return num + ' |' + line;
+ }).join('\n');
+ }
+
+ var lines = error.source.split(/\r\n?|\n|\f/);
+ var line = error.line;
+ var column = error.column;
+ var startLine = Math.max(1, line - extraLines) - 1;
+ var endLine = Math.min(line + extraLines, lines.length + 1);
+ var maxNumLength = Math.max(4, String(endLine).length) + 1;
+ var cutLeft = 0;
+
+ // column correction according to replaced tab before column
+ column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length;
+
+ if (column > MAX_LINE_LENGTH) {
+ cutLeft = column - OFFSET_CORRECTION + 3;
+ column = OFFSET_CORRECTION - 2;
+ }
+
+ for (var i = startLine; i <= endLine; i++) {
+ if (i >= 0 && i < lines.length) {
+ lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT);
+ lines[i] =
+ (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') +
+ lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +
+ (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : '');
+ }
+ }
+
+ return [
+ processLines(startLine, line),
+ new Array(column + maxNumLength + 2).join('-') + '^',
+ processLines(line, endLine)
+ ].filter(Boolean).join('\n');
+ }
+
+ var SyntaxError$1 = function(message, source, offset, line, column) {
+ var error = createCustomError('SyntaxError', message);
+
+ error.source = source;
+ error.offset = offset;
+ error.line = line;
+ error.column = column;
+
+ error.sourceFragment = function(extraLines) {
+ return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);
+ };
+ Object.defineProperty(error, 'formattedMessage', {
+ get: function() {
+ return (
+ 'Parse error: ' + error.message + '\n' +
+ sourceFragment(error, 2)
+ );
+ }
+ });
+
+ // for backward capability
+ error.parseError = {
+ offset: offset,
+ line: line,
+ column: column
+ };
+
+ return error;
+ };
+
+ var _SyntaxError = SyntaxError$1;
+
+ // CSS Syntax Module Level 3
+ // https://www.w3.org/TR/css-syntax-3/
+ var TYPE = {
+ EOF: 0, // <EOF-token>
+ Ident: 1, // <ident-token>
+ Function: 2, // <function-token>
+ AtKeyword: 3, // <at-keyword-token>
+ Hash: 4, // <hash-token>
+ String: 5, // <string-token>
+ BadString: 6, // <bad-string-token>
+ Url: 7, // <url-token>
+ BadUrl: 8, // <bad-url-token>
+ Delim: 9, // <delim-token>
+ Number: 10, // <number-token>
+ Percentage: 11, // <percentage-token>
+ Dimension: 12, // <dimension-token>
+ WhiteSpace: 13, // <whitespace-token>
+ CDO: 14, // <CDO-token>
+ CDC: 15, // <CDC-token>
+ Colon: 16, // <colon-token> :
+ Semicolon: 17, // <semicolon-token> ;
+ Comma: 18, // <comma-token> ,
+ LeftSquareBracket: 19, // <[-token>
+ RightSquareBracket: 20, // <]-token>
+ LeftParenthesis: 21, // <(-token>
+ RightParenthesis: 22, // <)-token>
+ LeftCurlyBracket: 23, // <{-token>
+ RightCurlyBracket: 24, // <}-token>
+ Comment: 25
+ };
+
+ var NAME = Object.keys(TYPE).reduce(function(result, key) {
+ result[TYPE[key]] = key;
+ return result;
+ }, {});
+
+ var _const = {
+ TYPE: TYPE,
+ NAME: NAME
+ };
+
+ var EOF = 0;
+
+ // https://drafts.csswg.org/css-syntax-3/
+ // § 4.2. Definitions
+
+ // digit
+ // A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9).
+ function isDigit(code) {
+ return code >= 0x0030 && code <= 0x0039;
+ }
+
+ // hex digit
+ // A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F),
+ // or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f).
+ function isHexDigit(code) {
+ return (
+ isDigit(code) || // 0 .. 9
+ (code >= 0x0041 && code <= 0x0046) || // A .. F
+ (code >= 0x0061 && code <= 0x0066) // a .. f
+ );
+ }
+
+ // uppercase letter
+ // A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z).
+ function isUppercaseLetter(code) {
+ return code >= 0x0041 && code <= 0x005A;
+ }
+
+ // lowercase letter
+ // A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z).
+ function isLowercaseLetter(code) {
+ return code >= 0x0061 && code <= 0x007A;
+ }
+
+ // letter
+ // An uppercase letter or a lowercase letter.
+ function isLetter(code) {
+ return isUppercaseLetter(code) || isLowercaseLetter(code);
+ }
+
+ // non-ASCII code point
+ // A code point with a value equal to or greater than U+0080 <control>.
+ function isNonAscii(code) {
+ return code >= 0x0080;
+ }
+
+ // name-start code point
+ // A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+ function isNameStart(code) {
+ return isLetter(code) || isNonAscii(code) || code === 0x005F;
+ }
+
+ // name code point
+ // A name-start code point, a digit, or U+002D HYPHEN-MINUS (-).
+ function isName(code) {
+ return isNameStart(code) || isDigit(code) || code === 0x002D;
+ }
+
+ // non-printable code point
+ // A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION,
+ // or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE.
+ function isNonPrintable(code) {
+ return (
+ (code >= 0x0000 && code <= 0x0008) ||
+ (code === 0x000B) ||
+ (code >= 0x000E && code <= 0x001F) ||
+ (code === 0x007F)
+ );
+ }
+
+ // newline
+ // U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+ // as they are converted to U+000A LINE FEED during preprocessing.
+ // TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED
+ function isNewline(code) {
+ return code === 0x000A || code === 0x000D || code === 0x000C;
+ }
+
+ // whitespace
+ // A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
+ function isWhiteSpace(code) {
+ return isNewline(code) || code === 0x0020 || code === 0x0009;
+ }
+
+ // § 4.3.8. Check if two code points are a valid escape
+ function isValidEscape(first, second) {
+ // If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+ if (first !== 0x005C) {
+ return false;
+ }
+
+ // Otherwise, if the second code point is a newline or EOF, return false.
+ if (isNewline(second) || second === EOF) {
+ return false;
+ }
+
+ // Otherwise, return true.
+ return true;
+ }
+
+ // § 4.3.9. Check if three code points would start an identifier
+ function isIdentifierStart(first, second, third) {
+ // Look at the first code point:
+
+ // U+002D HYPHEN-MINUS
+ if (first === 0x002D) {
+ // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS,
+ // or the second and third code points are a valid escape, return true. Otherwise, return false.
+ return (
+ isNameStart(second) ||
+ second === 0x002D ||
+ isValidEscape(second, third)
+ );
+ }
+
+ // name-start code point
+ if (isNameStart(first)) {
+ // Return true.
+ return true;
+ }
+
+ // U+005C REVERSE SOLIDUS (\)
+ if (first === 0x005C) {
+ // If the first and second code points are a valid escape, return true. Otherwise, return false.
+ return isValidEscape(first, second);
+ }
+
+ // anything else
+ // Return false.
+ return false;
+ }
+
+ // § 4.3.10. Check if three code points would start a number
+ function isNumberStart(first, second, third) {
+ // Look at the first code point:
+
+ // U+002B PLUS SIGN (+)
+ // U+002D HYPHEN-MINUS (-)
+ if (first === 0x002B || first === 0x002D) {
+ // If the second code point is a digit, return true.
+ if (isDigit(second)) {
+ return 2;
+ }
+
+ // Otherwise, if the second code point is a U+002E FULL STOP (.)
+ // and the third code point is a digit, return true.
+ // Otherwise, return false.
+ return second === 0x002E && isDigit(third) ? 3 : 0;
+ }
+
+ // U+002E FULL STOP (.)
+ if (first === 0x002E) {
+ // If the second code point is a digit, return true. Otherwise, return false.
+ return isDigit(second) ? 2 : 0;
+ }
+
+ // digit
+ if (isDigit(first)) {
+ // Return true.
+ return 1;
+ }
+
+ // anything else
+ // Return false.
+ return 0;
+ }
+
+ //
+ // Misc
+ //
+
+ // detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)
+ function isBOM(code) {
+ // UTF-16BE
+ if (code === 0xFEFF) {
+ return 1;
+ }
+
+ // UTF-16LE
+ if (code === 0xFFFE) {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ // Fast code category
+ //
+ // https://drafts.csswg.org/css-syntax/#tokenizer-definitions
+ // > non-ASCII code point
+ // > A code point with a value equal to or greater than U+0080 <control>
+ // > name-start code point
+ // > A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+ // > name code point
+ // > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)
+ // That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only
+ var CATEGORY = new Array(0x80);
+ charCodeCategory.Eof = 0x80;
+ charCodeCategory.WhiteSpace = 0x82;
+ charCodeCategory.Digit = 0x83;
+ charCodeCategory.NameStart = 0x84;
+ charCodeCategory.NonPrintable = 0x85;
+
+ for (var i = 0; i < CATEGORY.length; i++) {
+ switch (true) {
+ case isWhiteSpace(i):
+ CATEGORY[i] = charCodeCategory.WhiteSpace;
+ break;
+
+ case isDigit(i):
+ CATEGORY[i] = charCodeCategory.Digit;
+ break;
+
+ case isNameStart(i):
+ CATEGORY[i] = charCodeCategory.NameStart;
+ break;
+
+ case isNonPrintable(i):
+ CATEGORY[i] = charCodeCategory.NonPrintable;
+ break;
+
+ default:
+ CATEGORY[i] = i || charCodeCategory.Eof;
+ }
+ }
+
+ function charCodeCategory(code) {
+ return code < 0x80 ? CATEGORY[code] : charCodeCategory.NameStart;
+ }
+ var charCodeDefinitions = {
+ isDigit: isDigit,
+ isHexDigit: isHexDigit,
+ isUppercaseLetter: isUppercaseLetter,
+ isLowercaseLetter: isLowercaseLetter,
+ isLetter: isLetter,
+ isNonAscii: isNonAscii,
+ isNameStart: isNameStart,
+ isName: isName,
+ isNonPrintable: isNonPrintable,
+ isNewline: isNewline,
+ isWhiteSpace: isWhiteSpace,
+ isValidEscape: isValidEscape,
+ isIdentifierStart: isIdentifierStart,
+ isNumberStart: isNumberStart,
+
+ isBOM: isBOM,
+ charCodeCategory: charCodeCategory
+ };
+
+ var isDigit$1 = charCodeDefinitions.isDigit;
+ var isHexDigit$1 = charCodeDefinitions.isHexDigit;
+ var isUppercaseLetter$1 = charCodeDefinitions.isUppercaseLetter;
+ var isName$1 = charCodeDefinitions.isName;
+ var isWhiteSpace$1 = charCodeDefinitions.isWhiteSpace;
+ var isValidEscape$1 = charCodeDefinitions.isValidEscape;
+
+ function getCharCode(source, offset) {
+ return offset < source.length ? source.charCodeAt(offset) : 0;
+ }
+
+ function getNewlineLength(source, offset, code) {
+ if (code === 13 /* \r */ && getCharCode(source, offset + 1) === 10 /* \n */) {
+ return 2;
+ }
+
+ return 1;
+ }
+
+ function cmpChar(testStr, offset, referenceCode) {
+ var code = testStr.charCodeAt(offset);
+
+ // code.toLowerCase() for A..Z
+ if (isUppercaseLetter$1(code)) {
+ code = code | 32;
+ }
+
+ return code === referenceCode;
+ }
+
+ function cmpStr(testStr, start, end, referenceStr) {
+ if (end - start !== referenceStr.length) {
+ return false;
+ }
+
+ if (start < 0 || end > testStr.length) {
+ return false;
+ }
+
+ for (var i = start; i < end; i++) {
+ var testCode = testStr.charCodeAt(i);
+ var referenceCode = referenceStr.charCodeAt(i - start);
+
+ // testCode.toLowerCase() for A..Z
+ if (isUppercaseLetter$1(testCode)) {
+ testCode = testCode | 32;
+ }
+
+ if (testCode !== referenceCode) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function findWhiteSpaceStart(source, offset) {
+ for (; offset >= 0; offset--) {
+ if (!isWhiteSpace$1(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset + 1;
+ }
+
+ function findWhiteSpaceEnd(source, offset) {
+ for (; offset < source.length; offset++) {
+ if (!isWhiteSpace$1(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset;
+ }
+
+ function findDecimalNumberEnd(source, offset) {
+ for (; offset < source.length; offset++) {
+ if (!isDigit$1(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset;
+ }
+
+ // § 4.3.7. Consume an escaped code point
+ function consumeEscaped(source, offset) {
+ // It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and
+ // that the next input code point has already been verified to be part of a valid escape.
+ offset += 2;
+
+ // hex digit
+ if (isHexDigit$1(getCharCode(source, offset - 1))) {
+ // Consume as many hex digits as possible, but no more than 5.
+ // Note that this means 1-6 hex digits have been consumed in total.
+ for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) {
+ if (!isHexDigit$1(getCharCode(source, offset))) {
+ break;
+ }
+ }
+
+ // If the next input code point is whitespace, consume it as well.
+ var code = getCharCode(source, offset);
+ if (isWhiteSpace$1(code)) {
+ offset += getNewlineLength(source, offset, code);
+ }
+ }
+
+ return offset;
+ }
+
+ // §4.3.11. Consume a name
+ // Note: This algorithm does not do the verification of the first few code points that are necessary
+ // to ensure the returned code points would constitute an <ident-token>. If that is the intended use,
+ // ensure that the stream starts with an identifier before calling this algorithm.
+ function consumeName(source, offset) {
+ // Let result initially be an empty string.
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ // name code point
+ if (isName$1(code)) {
+ // Append the code point to result.
+ continue;
+ }
+
+ // the stream starts with a valid escape
+ if (isValidEscape$1(code, getCharCode(source, offset + 1))) {
+ // Consume an escaped code point. Append the returned code point to result.
+ offset = consumeEscaped(source, offset) - 1;
+ continue;
+ }
+
+ // anything else
+ // Reconsume the current input code point. Return result.
+ break;
+ }
+
+ return offset;
+ }
+
+ // §4.3.12. Consume a number
+ function consumeNumber(source, offset) {
+ var code = source.charCodeAt(offset);
+
+ // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-),
+ // consume it and append it to repr.
+ if (code === 0x002B || code === 0x002D) {
+ code = source.charCodeAt(offset += 1);
+ }
+
+ // 3. While the next input code point is a digit, consume it and append it to repr.
+ if (isDigit$1(code)) {
+ offset = findDecimalNumberEnd(source, offset + 1);
+ code = source.charCodeAt(offset);
+ }
+
+ // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+ if (code === 0x002E && isDigit$1(source.charCodeAt(offset + 1))) {
+ // 4.1 Consume them.
+ // 4.2 Append them to repr.
+ code = source.charCodeAt(offset += 2);
+
+ // 4.3 Set type to "number".
+ // TODO
+
+ // 4.4 While the next input code point is a digit, consume it and append it to repr.
+
+ offset = findDecimalNumberEnd(source, offset);
+ }
+
+ // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E)
+ // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then:
+ if (cmpChar(source, offset, 101 /* e */)) {
+ var sign = 0;
+ code = source.charCodeAt(offset + 1);
+
+ // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ...
+ if (code === 0x002D || code === 0x002B) {
+ sign = 1;
+ code = source.charCodeAt(offset + 2);
+ }
+
+ // ... followed by a digit
+ if (isDigit$1(code)) {
+ // 5.1 Consume them.
+ // 5.2 Append them to repr.
+
+ // 5.3 Set type to "number".
+ // TODO
+
+ // 5.4 While the next input code point is a digit, consume it and append it to repr.
+ offset = findDecimalNumberEnd(source, offset + 1 + sign + 1);
+ }
+ }
+
+ return offset;
+ }
+
+ // § 4.3.14. Consume the remnants of a bad url
+ // ... its sole use is to consume enough of the input stream to reach a recovery point
+ // where normal tokenizing can resume.
+ function consumeBadUrlRemnants(source, offset) {
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ // U+0029 RIGHT PARENTHESIS ())
+ // EOF
+ if (code === 0x0029) {
+ // Return.
+ offset++;
+ break;
+ }
+
+ if (isValidEscape$1(code, getCharCode(source, offset + 1))) {
+ // Consume an escaped code point.
+ // Note: This allows an escaped right parenthesis ("\)") to be encountered
+ // without ending the <bad-url-token>. This is otherwise identical to
+ // the "anything else" clause.
+ offset = consumeEscaped(source, offset);
+ }
+ }
+
+ return offset;
+ }
+
+ var utils = {
+ consumeEscaped: consumeEscaped,
+ consumeName: consumeName,
+ consumeNumber: consumeNumber,
+ consumeBadUrlRemnants: consumeBadUrlRemnants,
+
+ cmpChar: cmpChar,
+ cmpStr: cmpStr,
+
+ getNewlineLength: getNewlineLength,
+ findWhiteSpaceStart: findWhiteSpaceStart,
+ findWhiteSpaceEnd: findWhiteSpaceEnd
+ };
+
+ var TYPE$1 = _const.TYPE;
+ var NAME$1 = _const.NAME;
+
+
+ var cmpStr$1 = utils.cmpStr;
+
+ var EOF$1 = TYPE$1.EOF;
+ var WHITESPACE = TYPE$1.WhiteSpace;
+ var COMMENT = TYPE$1.Comment;
+
+ var OFFSET_MASK = 0x00FFFFFF;
+ var TYPE_SHIFT = 24;
+
+ var TokenStream = function() {
+ this.offsetAndType = null;
+ this.balance = null;
+
+ this.reset();
+ };
+
+ TokenStream.prototype = {
+ reset: function() {
+ this.eof = false;
+ this.tokenIndex = -1;
+ this.tokenType = 0;
+ this.tokenStart = this.firstCharOffset;
+ this.tokenEnd = this.firstCharOffset;
+ },
+
+ lookupType: function(offset) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return this.offsetAndType[offset] >> TYPE_SHIFT;
+ }
+
+ return EOF$1;
+ },
+ lookupOffset: function(offset) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return this.offsetAndType[offset - 1] & OFFSET_MASK;
+ }
+
+ return this.source.length;
+ },
+ lookupValue: function(offset, referenceStr) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return cmpStr$1(
+ this.source,
+ this.offsetAndType[offset - 1] & OFFSET_MASK,
+ this.offsetAndType[offset] & OFFSET_MASK,
+ referenceStr
+ );
+ }
+
+ return false;
+ },
+ getTokenStart: function(tokenIndex) {
+ if (tokenIndex === this.tokenIndex) {
+ return this.tokenStart;
+ }
+
+ if (tokenIndex > 0) {
+ return tokenIndex < this.tokenCount
+ ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK
+ : this.offsetAndType[this.tokenCount] & OFFSET_MASK;
+ }
+
+ return this.firstCharOffset;
+ },
+
+ // TODO: -> skipUntilBalanced
+ getRawLength: function(startToken, mode) {
+ var cursor = startToken;
+ var balanceEnd;
+ var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK;
+ var type;
+
+ loop:
+ for (; cursor < this.tokenCount; cursor++) {
+ balanceEnd = this.balance[cursor];
+
+ // stop scanning on balance edge that points to offset before start token
+ if (balanceEnd < startToken) {
+ break loop;
+ }
+
+ type = this.offsetAndType[cursor] >> TYPE_SHIFT;
+
+ // check token is stop type
+ switch (mode(type, this.source, offset)) {
+ case 1:
+ break loop;
+
+ case 2:
+ cursor++;
+ break loop;
+
+ default:
+ offset = this.offsetAndType[cursor] & OFFSET_MASK;
+
+ // fast forward to the end of balanced block
+ if (this.balance[balanceEnd] === cursor) {
+ cursor = balanceEnd;
+ }
+ }
+ }
+
+ return cursor - this.tokenIndex;
+ },
+ isBalanceEdge: function(pos) {
+ return this.balance[this.tokenIndex] < pos;
+ },
+ isDelim: function(code, offset) {
+ if (offset) {
+ return (
+ this.lookupType(offset) === TYPE$1.Delim &&
+ this.source.charCodeAt(this.lookupOffset(offset)) === code
+ );
+ }
+
+ return (
+ this.tokenType === TYPE$1.Delim &&
+ this.source.charCodeAt(this.tokenStart) === code
+ );
+ },
+
+ getTokenValue: function() {
+ return this.source.substring(this.tokenStart, this.tokenEnd);
+ },
+ getTokenLength: function() {
+ return this.tokenEnd - this.tokenStart;
+ },
+ substrToCursor: function(start) {
+ return this.source.substring(start, this.tokenStart);
+ },
+
+ skipWS: function() {
+ for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {
+ if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {
+ break;
+ }
+ }
+
+ if (skipTokenCount > 0) {
+ this.skip(skipTokenCount);
+ }
+ },
+ skipSC: function() {
+ while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {
+ this.next();
+ }
+ },
+ skip: function(tokenCount) {
+ var next = this.tokenIndex + tokenCount;
+
+ if (next < this.tokenCount) {
+ this.tokenIndex = next;
+ this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;
+ next = this.offsetAndType[next];
+ this.tokenType = next >> TYPE_SHIFT;
+ this.tokenEnd = next & OFFSET_MASK;
+ } else {
+ this.tokenIndex = this.tokenCount;
+ this.next();
+ }
+ },
+ next: function() {
+ var next = this.tokenIndex + 1;
+
+ if (next < this.tokenCount) {
+ this.tokenIndex = next;
+ this.tokenStart = this.tokenEnd;
+ next = this.offsetAndType[next];
+ this.tokenType = next >> TYPE_SHIFT;
+ this.tokenEnd = next & OFFSET_MASK;
+ } else {
+ this.tokenIndex = this.tokenCount;
+ this.eof = true;
+ this.tokenType = EOF$1;
+ this.tokenStart = this.tokenEnd = this.source.length;
+ }
+ },
+
+ forEachToken(fn) {
+ for (var i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) {
+ var start = offset;
+ var item = this.offsetAndType[i];
+ var end = item & OFFSET_MASK;
+ var type = item >> TYPE_SHIFT;
+
+ offset = end;
+
+ fn(type, start, end, i);
+ }
+ },
+
+ dump() {
+ var tokens = new Array(this.tokenCount);
+
+ this.forEachToken((type, start, end, index) => {
+ tokens[index] = {
+ idx: index,
+ type: NAME$1[type],
+ chunk: this.source.substring(start, end),
+ balance: this.balance[index]
+ };
+ });
+
+ return tokens;
+ }
+ };
+
+ var TokenStream_1 = TokenStream;
+
+ function noop(value) {
+ return value;
+ }
+
+ function generateMultiplier(multiplier) {
+ if (multiplier.min === 0 && multiplier.max === 0) {
+ return '*';
+ }
+
+ if (multiplier.min === 0 && multiplier.max === 1) {
+ return '?';
+ }
+
+ if (multiplier.min === 1 && multiplier.max === 0) {
+ return multiplier.comma ? '#' : '+';
+ }
+
+ if (multiplier.min === 1 && multiplier.max === 1) {
+ return '';
+ }
+
+ return (
+ (multiplier.comma ? '#' : '') +
+ (multiplier.min === multiplier.max
+ ? '{' + multiplier.min + '}'
+ : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}'
+ )
+ );
+ }
+
+ function generateTypeOpts(node) {
+ switch (node.type) {
+ case 'Range':
+ return (
+ ' [' +
+ (node.min === null ? '-∞' : node.min) +
+ ',' +
+ (node.max === null ? '∞' : node.max) +
+ ']'
+ );
+
+ default:
+ throw new Error('Unknown node type `' + node.type + '`');
+ }
+ }
+
+ function generateSequence(node, decorate, forceBraces, compact) {
+ var combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' ';
+ var result = node.terms.map(function(term) {
+ return generate(term, decorate, forceBraces, compact);
+ }).join(combinator);
+
+ if (node.explicit || forceBraces) {
+ result = (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]');
+ }
+
+ return result;
+ }
+
+ function generate(node, decorate, forceBraces, compact) {
+ var result;
+
+ switch (node.type) {
+ case 'Group':
+ result =
+ generateSequence(node, decorate, forceBraces, compact) +
+ (node.disallowEmpty ? '!' : '');
+ break;
+
+ case 'Multiplier':
+ // return since node is a composition
+ return (
+ generate(node.term, decorate, forceBraces, compact) +
+ decorate(generateMultiplier(node), node)
+ );
+
+ case 'Type':
+ result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';
+ break;
+
+ case 'Property':
+ result = '<\'' + node.name + '\'>';
+ break;
+
+ case 'Keyword':
+ result = node.name;
+ break;
+
+ case 'AtKeyword':
+ result = '@' + node.name;
+ break;
+
+ case 'Function':
+ result = node.name + '(';
+ break;
+
+ case 'String':
+ case 'Token':
+ result = node.value;
+ break;
+
+ case 'Comma':
+ result = ',';
+ break;
+
+ default:
+ throw new Error('Unknown node type `' + node.type + '`');
+ }
+
+ return decorate(result, node);
+ }
+
+ var generate_1 = function(node, options) {
+ var decorate = noop;
+ var forceBraces = false;
+ var compact = false;
+
+ if (typeof options === 'function') {
+ decorate = options;
+ } else if (options) {
+ forceBraces = Boolean(options.forceBraces);
+ compact = Boolean(options.compact);
+ if (typeof options.decorate === 'function') {
+ decorate = options.decorate;
+ }
+ }
+
+ return generate(node, decorate, forceBraces, compact);
+ };
+
+ const defaultLoc = { offset: 0, line: 1, column: 1 };
+
+ function locateMismatch(matchResult, node) {
+ const tokens = matchResult.tokens;
+ const longestMatch = matchResult.longestMatch;
+ const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null;
+ const badNode = mismatchNode !== node ? mismatchNode : null;
+ let mismatchOffset = 0;
+ let mismatchLength = 0;
+ let entries = 0;
+ let css = '';
+ let start;
+ let end;
+
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i].value;
+
+ if (i === longestMatch) {
+ mismatchLength = token.length;
+ mismatchOffset = css.length;
+ }
+
+ if (badNode !== null && tokens[i].node === badNode) {
+ if (i <= longestMatch) {
+ entries++;
+ } else {
+ entries = 0;
+ }
+ }
+
+ css += token;
+ }
+
+ if (longestMatch === tokens.length || entries > 1) { // last
+ start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css);
+ end = buildLoc(start);
+ } else {
+ start = fromLoc(badNode, 'start') ||
+ buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset));
+ end = fromLoc(badNode, 'end') ||
+ buildLoc(start, css.substr(mismatchOffset, mismatchLength));
+ }
+
+ return {
+ css,
+ mismatchOffset,
+ mismatchLength,
+ start,
+ end
+ };
+ }
+
+ function fromLoc(node, point) {
+ const value = node && node.loc && node.loc[point];
+
+ if (value) {
+ return 'line' in value ? buildLoc(value) : value;
+ }
+
+ return null;
+ }
+
+ function buildLoc({ offset, line, column }, extra) {
+ const loc = {
+ offset,
+ line,
+ column
+ };
+
+ if (extra) {
+ const lines = extra.split(/\n|\r\n?|\f/);
+
+ loc.offset += extra.length;
+ loc.line += lines.length - 1;
+ loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1;
+ }
+
+ return loc;
+ }
+
+ const SyntaxReferenceError = function(type, referenceName) {
+ const error = createCustomError(
+ 'SyntaxReferenceError',
+ type + (referenceName ? ' `' + referenceName + '`' : '')
+ );
+
+ error.reference = referenceName;
+
+ return error;
+ };
+
+ const SyntaxMatchError = function(message, syntax, node, matchResult) {
+ const error = createCustomError('SyntaxMatchError', message);
+ const {
+ css,
+ mismatchOffset,
+ mismatchLength,
+ start,
+ end
+ } = locateMismatch(matchResult, node);
+
+ error.rawMessage = message;
+ error.syntax = syntax ? generate_1(syntax) : '<generic>';
+ error.css = css;
+ error.mismatchOffset = mismatchOffset;
+ error.mismatchLength = mismatchLength;
+ error.message = message + '\n' +
+ ' syntax: ' + error.syntax + '\n' +
+ ' value: ' + (css || '<empty string>') + '\n' +
+ ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
+
+ Object.assign(error, start);
+ error.loc = {
+ source: (node && node.loc && node.loc.source) || '<unknown>',
+ start,
+ end
+ };
+
+ return error;
+ };
+
+ var error = {
+ SyntaxReferenceError,
+ SyntaxMatchError
+ };
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var keywords = Object.create(null);
+ var properties = Object.create(null);
+ var HYPHENMINUS = 45; // '-'.charCodeAt()
+
+ function isCustomProperty(str, offset) {
+ offset = offset || 0;
+
+ return str.length - offset >= 2 &&
+ str.charCodeAt(offset) === HYPHENMINUS &&
+ str.charCodeAt(offset + 1) === HYPHENMINUS;
+ }
+
+ function getVendorPrefix(str, offset) {
+ offset = offset || 0;
+
+ // verdor prefix should be at least 3 chars length
+ if (str.length - offset >= 3) {
+ // vendor prefix starts with hyper minus following non-hyper minus
+ if (str.charCodeAt(offset) === HYPHENMINUS &&
+ str.charCodeAt(offset + 1) !== HYPHENMINUS) {
+ // vendor prefix should contain a hyper minus at the ending
+ var secondDashIndex = str.indexOf('-', offset + 2);
+
+ if (secondDashIndex !== -1) {
+ return str.substring(offset, secondDashIndex + 1);
+ }
+ }
+ }
+
+ return '';
+ }
+
+ function getKeywordDescriptor(keyword) {
+ if (hasOwnProperty.call(keywords, keyword)) {
+ return keywords[keyword];
+ }
+
+ var name = keyword.toLowerCase();
+
+ if (hasOwnProperty.call(keywords, name)) {
+ return keywords[keyword] = keywords[name];
+ }
+
+ var custom = isCustomProperty(name, 0);
+ var vendor = !custom ? getVendorPrefix(name, 0) : '';
+
+ return keywords[keyword] = Object.freeze({
+ basename: name.substr(vendor.length),
+ name: name,
+ vendor: vendor,
+ prefix: vendor,
+ custom: custom
+ });
+ }
+
+ function getPropertyDescriptor(property) {
+ if (hasOwnProperty.call(properties, property)) {
+ return properties[property];
+ }
+
+ var name = property;
+ var hack = property[0];
+
+ if (hack === '/') {
+ hack = property[1] === '/' ? '//' : '/';
+ } else if (hack !== '_' &&
+ hack !== '*' &&
+ hack !== '$' &&
+ hack !== '#' &&
+ hack !== '+' &&
+ hack !== '&') {
+ hack = '';
+ }
+
+ var custom = isCustomProperty(name, hack.length);
+
+ // re-use result when possible (the same as for lower case)
+ if (!custom) {
+ name = name.toLowerCase();
+ if (hasOwnProperty.call(properties, name)) {
+ return properties[property] = properties[name];
+ }
+ }
+
+ var vendor = !custom ? getVendorPrefix(name, hack.length) : '';
+ var prefix = name.substr(0, hack.length + vendor.length);
+
+ return properties[property] = Object.freeze({
+ basename: name.substr(prefix.length),
+ name: name.substr(hack.length),
+ hack: hack,
+ vendor: vendor,
+ prefix: prefix,
+ custom: custom
+ });
+ }
+
+ var names = {
+ keyword: getKeywordDescriptor,
+ property: getPropertyDescriptor,
+ isCustomProperty: isCustomProperty,
+ vendorPrefix: getVendorPrefix
+ };
+
+ var MIN_SIZE = 16 * 1024;
+ var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported
+
+ var adoptBuffer = function adoptBuffer(buffer, size) {
+ if (buffer === null || buffer.length < size) {
+ return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE));
+ }
+
+ return buffer;
+ };
+
+ var TYPE$2 = _const.TYPE;
+
+
+ var isNewline$1 = charCodeDefinitions.isNewline;
+ var isName$2 = charCodeDefinitions.isName;
+ var isValidEscape$2 = charCodeDefinitions.isValidEscape;
+ var isNumberStart$1 = charCodeDefinitions.isNumberStart;
+ var isIdentifierStart$1 = charCodeDefinitions.isIdentifierStart;
+ var charCodeCategory$1 = charCodeDefinitions.charCodeCategory;
+ var isBOM$1 = charCodeDefinitions.isBOM;
+
+
+ var cmpStr$2 = utils.cmpStr;
+ var getNewlineLength$1 = utils.getNewlineLength;
+ var findWhiteSpaceEnd$1 = utils.findWhiteSpaceEnd;
+ var consumeEscaped$1 = utils.consumeEscaped;
+ var consumeName$1 = utils.consumeName;
+ var consumeNumber$1 = utils.consumeNumber;
+ var consumeBadUrlRemnants$1 = utils.consumeBadUrlRemnants;
+
+ var OFFSET_MASK$1 = 0x00FFFFFF;
+ var TYPE_SHIFT$1 = 24;
+
+ function tokenize(source, stream) {
+ function getCharCode(offset) {
+ return offset < sourceLength ? source.charCodeAt(offset) : 0;
+ }
+
+ // § 4.3.3. Consume a numeric token
+ function consumeNumericToken() {
+ // Consume a number and let number be the result.
+ offset = consumeNumber$1(source, offset);
+
+ // If the next 3 input code points would start an identifier, then:
+ if (isIdentifierStart$1(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.
+ // Consume a name. Set the <dimension-token>’s unit to the returned value.
+ // Return the <dimension-token>.
+ type = TYPE$2.Dimension;
+ offset = consumeName$1(source, offset);
+ return;
+ }
+
+ // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+ if (getCharCode(offset) === 0x0025) {
+ // Create a <percentage-token> with the same value as number, and return it.
+ type = TYPE$2.Percentage;
+ offset++;
+ return;
+ }
+
+ // Otherwise, create a <number-token> with the same value and type flag as number, and return it.
+ type = TYPE$2.Number;
+ }
+
+ // § 4.3.4. Consume an ident-like token
+ function consumeIdentLikeToken() {
+ const nameStartOffset = offset;
+
+ // Consume a name, and let string be the result.
+ offset = consumeName$1(source, offset);
+
+ // If string’s value is an ASCII case-insensitive match for "url",
+ // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+ if (cmpStr$2(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) {
+ // While the next two input code points are whitespace, consume the next input code point.
+ offset = findWhiteSpaceEnd$1(source, offset + 1);
+
+ // If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('),
+ // or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('),
+ // then create a <function-token> with its value set to string and return it.
+ if (getCharCode(offset) === 0x0022 ||
+ getCharCode(offset) === 0x0027) {
+ type = TYPE$2.Function;
+ offset = nameStartOffset + 4;
+ return;
+ }
+
+ // Otherwise, consume a url token, and return it.
+ consumeUrlToken();
+ return;
+ }
+
+ // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+ // Create a <function-token> with its value set to string and return it.
+ if (getCharCode(offset) === 0x0028) {
+ type = TYPE$2.Function;
+ offset++;
+ return;
+ }
+
+ // Otherwise, create an <ident-token> with its value set to string and return it.
+ type = TYPE$2.Ident;
+ }
+
+ // § 4.3.5. Consume a string token
+ function consumeStringToken(endingCodePoint) {
+ // This algorithm may be called with an ending code point, which denotes the code point
+ // that ends the string. If an ending code point is not specified,
+ // the current input code point is used.
+ if (!endingCodePoint) {
+ endingCodePoint = getCharCode(offset++);
+ }
+
+ // Initially create a <string-token> with its value set to the empty string.
+ type = TYPE$2.String;
+
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ switch (charCodeCategory$1(code)) {
+ // ending code point
+ case endingCodePoint:
+ // Return the <string-token>.
+ offset++;
+ return;
+
+ // EOF
+ case charCodeCategory$1.Eof:
+ // This is a parse error. Return the <string-token>.
+ return;
+
+ // newline
+ case charCodeCategory$1.WhiteSpace:
+ if (isNewline$1(code)) {
+ // This is a parse error. Reconsume the current input code point,
+ // create a <bad-string-token>, and return it.
+ offset += getNewlineLength$1(source, offset, code);
+ type = TYPE$2.BadString;
+ return;
+ }
+ break;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the next input code point is EOF, do nothing.
+ if (offset === source.length - 1) {
+ break;
+ }
+
+ var nextCode = getCharCode(offset + 1);
+
+ // Otherwise, if the next input code point is a newline, consume it.
+ if (isNewline$1(nextCode)) {
+ offset += getNewlineLength$1(source, offset + 1, nextCode);
+ } else if (isValidEscape$2(code, nextCode)) {
+ // Otherwise, (the stream starts with a valid escape) consume
+ // an escaped code point and append the returned code point to
+ // the <string-token>’s value.
+ offset = consumeEscaped$1(source, offset) - 1;
+ }
+ break;
+
+ // anything else
+ // Append the current input code point to the <string-token>’s value.
+ }
+ }
+ }
+
+ // § 4.3.6. Consume a url token
+ // Note: This algorithm assumes that the initial "url(" has already been consumed.
+ // This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+ // A quoted value, like url("foo"), is parsed as a <function-token>. Consume an ident-like token
+ // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+ function consumeUrlToken() {
+ // Initially create a <url-token> with its value set to the empty string.
+ type = TYPE$2.Url;
+
+ // Consume as much whitespace as possible.
+ offset = findWhiteSpaceEnd$1(source, offset);
+
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ switch (charCodeCategory$1(code)) {
+ // U+0029 RIGHT PARENTHESIS ())
+ case 0x0029:
+ // Return the <url-token>.
+ offset++;
+ return;
+
+ // EOF
+ case charCodeCategory$1.Eof:
+ // This is a parse error. Return the <url-token>.
+ return;
+
+ // whitespace
+ case charCodeCategory$1.WhiteSpace:
+ // Consume as much whitespace as possible.
+ offset = findWhiteSpaceEnd$1(source, offset);
+
+ // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF,
+ // consume it and return the <url-token>
+ // (if EOF was encountered, this is a parse error);
+ if (getCharCode(offset) === 0x0029 || offset >= source.length) {
+ if (offset < source.length) {
+ offset++;
+ }
+ return;
+ }
+
+ // otherwise, consume the remnants of a bad url, create a <bad-url-token>,
+ // and return it.
+ offset = consumeBadUrlRemnants$1(source, offset);
+ type = TYPE$2.BadUrl;
+ return;
+
+ // U+0022 QUOTATION MARK (")
+ // U+0027 APOSTROPHE (')
+ // U+0028 LEFT PARENTHESIS (()
+ // non-printable code point
+ case 0x0022:
+ case 0x0027:
+ case 0x0028:
+ case charCodeCategory$1.NonPrintable:
+ // This is a parse error. Consume the remnants of a bad url,
+ // create a <bad-url-token>, and return it.
+ offset = consumeBadUrlRemnants$1(source, offset);
+ type = TYPE$2.BadUrl;
+ return;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the stream starts with a valid escape, consume an escaped code point and
+ // append the returned code point to the <url-token>’s value.
+ if (isValidEscape$2(code, getCharCode(offset + 1))) {
+ offset = consumeEscaped$1(source, offset) - 1;
+ break;
+ }
+
+ // Otherwise, this is a parse error. Consume the remnants of a bad url,
+ // create a <bad-url-token>, and return it.
+ offset = consumeBadUrlRemnants$1(source, offset);
+ type = TYPE$2.BadUrl;
+ return;
+
+ // anything else
+ // Append the current input code point to the <url-token>’s value.
+ }
+ }
+ }
+
+ if (!stream) {
+ stream = new TokenStream_1();
+ }
+
+ // ensure source is a string
+ source = String(source || '');
+
+ var sourceLength = source.length;
+ var offsetAndType = adoptBuffer(stream.offsetAndType, sourceLength + 1); // +1 because of eof-token
+ var balance = adoptBuffer(stream.balance, sourceLength + 1);
+ var tokenCount = 0;
+ var start = isBOM$1(getCharCode(0));
+ var offset = start;
+ var balanceCloseType = 0;
+ var balanceStart = 0;
+ var balancePrev = 0;
+
+ // https://drafts.csswg.org/css-syntax-3/#consume-token
+ // § 4.3.1. Consume a token
+ while (offset < sourceLength) {
+ var code = source.charCodeAt(offset);
+ var type = 0;
+
+ balance[tokenCount] = sourceLength;
+
+ switch (charCodeCategory$1(code)) {
+ // whitespace
+ case charCodeCategory$1.WhiteSpace:
+ // Consume as much whitespace as possible. Return a <whitespace-token>.
+ type = TYPE$2.WhiteSpace;
+ offset = findWhiteSpaceEnd$1(source, offset + 1);
+ break;
+
+ // U+0022 QUOTATION MARK (")
+ case 0x0022:
+ // Consume a string token and return it.
+ consumeStringToken();
+ break;
+
+ // U+0023 NUMBER SIGN (#)
+ case 0x0023:
+ // If the next input code point is a name code point or the next two input code points are a valid escape, then:
+ if (isName$2(getCharCode(offset + 1)) || isValidEscape$2(getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // Create a <hash-token>.
+ type = TYPE$2.Hash;
+
+ // If the next 3 input code points would start an identifier, set the <hash-token>’s type flag to "id".
+ // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+ // // TODO: set id flag
+ // }
+
+ // Consume a name, and set the <hash-token>’s value to the returned string.
+ offset = consumeName$1(source, offset + 1);
+
+ // Return the <hash-token>.
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+0027 APOSTROPHE (')
+ case 0x0027:
+ // Consume a string token and return it.
+ consumeStringToken();
+ break;
+
+ // U+0028 LEFT PARENTHESIS (()
+ case 0x0028:
+ // Return a <(-token>.
+ type = TYPE$2.LeftParenthesis;
+ offset++;
+ break;
+
+ // U+0029 RIGHT PARENTHESIS ())
+ case 0x0029:
+ // Return a <)-token>.
+ type = TYPE$2.RightParenthesis;
+ offset++;
+ break;
+
+ // U+002B PLUS SIGN (+)
+ case 0x002B:
+ // If the input stream starts with a number, ...
+ if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+ break;
+
+ // U+002C COMMA (,)
+ case 0x002C:
+ // Return a <comma-token>.
+ type = TYPE$2.Comma;
+ offset++;
+ break;
+
+ // U+002D HYPHEN-MINUS (-)
+ case 0x002D:
+ // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+ if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ consumeNumericToken();
+ } else {
+ // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a <CDC-token>.
+ if (getCharCode(offset + 1) === 0x002D &&
+ getCharCode(offset + 2) === 0x003E) {
+ type = TYPE$2.CDC;
+ offset = offset + 3;
+ } else {
+ // Otherwise, if the input stream starts with an identifier, ...
+ if (isIdentifierStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+ }
+ }
+ break;
+
+ // U+002E FULL STOP (.)
+ case 0x002E:
+ // If the input stream starts with a number, ...
+ if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+002F SOLIDUS (/)
+ case 0x002F:
+ // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+ if (getCharCode(offset + 1) === 0x002A) {
+ // ... consume them and all following code points up to and including the first U+002A ASTERISK (*)
+ // followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+ type = TYPE$2.Comment;
+ offset = source.indexOf('*/', offset + 2) + 2;
+ if (offset === 1) {
+ offset = source.length;
+ }
+ } else {
+ type = TYPE$2.Delim;
+ offset++;
+ }
+ break;
+
+ // U+003A COLON (:)
+ case 0x003A:
+ // Return a <colon-token>.
+ type = TYPE$2.Colon;
+ offset++;
+ break;
+
+ // U+003B SEMICOLON (;)
+ case 0x003B:
+ // Return a <semicolon-token>.
+ type = TYPE$2.Semicolon;
+ offset++;
+ break;
+
+ // U+003C LESS-THAN SIGN (<)
+ case 0x003C:
+ // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ...
+ if (getCharCode(offset + 1) === 0x0021 &&
+ getCharCode(offset + 2) === 0x002D &&
+ getCharCode(offset + 3) === 0x002D) {
+ // ... consume them and return a <CDO-token>.
+ type = TYPE$2.CDO;
+ offset = offset + 4;
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+0040 COMMERCIAL AT (@)
+ case 0x0040:
+ // If the next 3 input code points would start an identifier, ...
+ if (isIdentifierStart$1(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+ // ... consume a name, create an <at-keyword-token> with its value set to the returned value, and return it.
+ type = TYPE$2.AtKeyword;
+ offset = consumeName$1(source, offset + 1);
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+005B LEFT SQUARE BRACKET ([)
+ case 0x005B:
+ // Return a <[-token>.
+ type = TYPE$2.LeftSquareBracket;
+ offset++;
+ break;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the input stream starts with a valid escape, ...
+ if (isValidEscape$2(code, getCharCode(offset + 1))) {
+ // ... reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ } else {
+ // Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+ break;
+
+ // U+005D RIGHT SQUARE BRACKET (])
+ case 0x005D:
+ // Return a <]-token>.
+ type = TYPE$2.RightSquareBracket;
+ offset++;
+ break;
+
+ // U+007B LEFT CURLY BRACKET ({)
+ case 0x007B:
+ // Return a <{-token>.
+ type = TYPE$2.LeftCurlyBracket;
+ offset++;
+ break;
+
+ // U+007D RIGHT CURLY BRACKET (})
+ case 0x007D:
+ // Return a <}-token>.
+ type = TYPE$2.RightCurlyBracket;
+ offset++;
+ break;
+
+ // digit
+ case charCodeCategory$1.Digit:
+ // Reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ break;
+
+ // name-start code point
+ case charCodeCategory$1.NameStart:
+ // Reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ break;
+
+ // EOF
+ case charCodeCategory$1.Eof:
+ // Return an <EOF-token>.
+ break;
+
+ // anything else
+ default:
+ // Return a <delim-token> with its value set to the current input code point.
+ type = TYPE$2.Delim;
+ offset++;
+ }
+
+ switch (type) {
+ case balanceCloseType:
+ balancePrev = balanceStart & OFFSET_MASK$1;
+ balanceStart = balance[balancePrev];
+ balanceCloseType = balanceStart >> TYPE_SHIFT$1;
+ balance[tokenCount] = balancePrev;
+ balance[balancePrev++] = tokenCount;
+ for (; balancePrev < tokenCount; balancePrev++) {
+ if (balance[balancePrev] === sourceLength) {
+ balance[balancePrev] = tokenCount;
+ }
+ }
+ break;
+
+ case TYPE$2.LeftParenthesis:
+ case TYPE$2.Function:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE$2.RightParenthesis;
+ balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+ break;
+
+ case TYPE$2.LeftSquareBracket:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE$2.RightSquareBracket;
+ balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+ break;
+
+ case TYPE$2.LeftCurlyBracket:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE$2.RightCurlyBracket;
+ balanceStart = (balanceCloseType << TYPE_SHIFT$1) | tokenCount;
+ break;
+ }
+
+ offsetAndType[tokenCount++] = (type << TYPE_SHIFT$1) | offset;
+ }
+
+ // finalize buffers
+ offsetAndType[tokenCount] = (TYPE$2.EOF << TYPE_SHIFT$1) | offset; // <EOF-token>
+ balance[tokenCount] = sourceLength;
+ balance[sourceLength] = sourceLength; // prevents false positive balance match with any token
+ while (balanceStart !== 0) {
+ balancePrev = balanceStart & OFFSET_MASK$1;
+ balanceStart = balance[balancePrev];
+ balance[balancePrev] = sourceLength;
+ }
+
+ // update stream
+ stream.source = source;
+ stream.firstCharOffset = start;
+ stream.offsetAndType = offsetAndType;
+ stream.tokenCount = tokenCount;
+ stream.balance = balance;
+ stream.reset();
+ stream.next();
+
+ return stream;
+ }
+
+ // extend tokenizer with constants
+ Object.keys(_const).forEach(function(key) {
+ tokenize[key] = _const[key];
+ });
+
+ // extend tokenizer with static methods from utils
+ Object.keys(charCodeDefinitions).forEach(function(key) {
+ tokenize[key] = charCodeDefinitions[key];
+ });
+ Object.keys(utils).forEach(function(key) {
+ tokenize[key] = utils[key];
+ });
+
+ var tokenizer = tokenize;
+
+ var isDigit$2 = tokenizer.isDigit;
+ var cmpChar$1 = tokenizer.cmpChar;
+ var TYPE$3 = tokenizer.TYPE;
+
+ var DELIM = TYPE$3.Delim;
+ var WHITESPACE$1 = TYPE$3.WhiteSpace;
+ var COMMENT$1 = TYPE$3.Comment;
+ var IDENT = TYPE$3.Ident;
+ var NUMBER = TYPE$3.Number;
+ var DIMENSION = TYPE$3.Dimension;
+ var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+ var HYPHENMINUS$1 = 0x002D; // U+002D HYPHEN-MINUS (-)
+ var N = 0x006E; // U+006E LATIN SMALL LETTER N (n)
+ var DISALLOW_SIGN = true;
+ var ALLOW_SIGN = false;
+
+ function isDelim(token, code) {
+ return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+ }
+
+ function skipSC(token, offset, getNextToken) {
+ while (token !== null && (token.type === WHITESPACE$1 || token.type === COMMENT$1)) {
+ token = getNextToken(++offset);
+ }
+
+ return offset;
+ }
+
+ function checkInteger(token, valueOffset, disallowSign, offset) {
+ if (!token) {
+ return 0;
+ }
+
+ var code = token.value.charCodeAt(valueOffset);
+
+ if (code === PLUSSIGN || code === HYPHENMINUS$1) {
+ if (disallowSign) {
+ // Number sign is not allowed
+ return 0;
+ }
+ valueOffset++;
+ }
+
+ for (; valueOffset < token.value.length; valueOffset++) {
+ if (!isDigit$2(token.value.charCodeAt(valueOffset))) {
+ // Integer is expected
+ return 0;
+ }
+ }
+
+ return offset + 1;
+ }
+
+ // ... <signed-integer>
+ // ... ['+' | '-'] <signless-integer>
+ function consumeB(token, offset_, getNextToken) {
+ var sign = false;
+ var offset = skipSC(token, offset_, getNextToken);
+
+ token = getNextToken(offset);
+
+ if (token === null) {
+ return offset_;
+ }
+
+ if (token.type !== NUMBER) {
+ if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS$1)) {
+ sign = true;
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ if (token === null && token.type !== NUMBER) {
+ return 0;
+ }
+ } else {
+ return offset_;
+ }
+ }
+
+ if (!sign) {
+ var code = token.value.charCodeAt(0);
+ if (code !== PLUSSIGN && code !== HYPHENMINUS$1) {
+ // Number sign is expected
+ return 0;
+ }
+ }
+
+ return checkInteger(token, sign ? 0 : 1, sign, offset);
+ }
+
+ // An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+ var genericAnPlusB = function anPlusB(token, getNextToken) {
+ /* eslint-disable brace-style*/
+ var offset = 0;
+
+ if (!token) {
+ return 0;
+ }
+
+ // <integer>
+ if (token.type === NUMBER) {
+ return checkInteger(token, 0, ALLOW_SIGN, offset); // b
+ }
+
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ // -n- <signless-integer>
+ // <dashndashdigit-ident>
+ else if (token.type === IDENT && token.value.charCodeAt(0) === HYPHENMINUS$1) {
+ // expect 1st char is N
+ if (!cmpChar$1(token.value, 1, N)) {
+ return 0;
+ }
+
+ switch (token.value.length) {
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ case 2:
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+
+ // -n- <signless-integer>
+ case 3:
+ if (token.value.charCodeAt(2) !== HYPHENMINUS$1) {
+ return 0;
+ }
+
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+ // <dashndashdigit-ident>
+ default:
+ if (token.value.charCodeAt(2) !== HYPHENMINUS$1) {
+ return 0;
+ }
+
+ return checkInteger(token, 3, DISALLOW_SIGN, offset);
+ }
+ }
+
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ // '+'? n- <signless-integer>
+ // '+'? <ndashdigit-ident>
+ else if (token.type === IDENT || (isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === IDENT)) {
+ // just ignore a plus
+ if (token.type !== IDENT) {
+ token = getNextToken(++offset);
+ }
+
+ if (token === null || !cmpChar$1(token.value, 0, N)) {
+ return 0;
+ }
+
+ switch (token.value.length) {
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ case 1:
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+
+ // '+'? n- <signless-integer>
+ case 2:
+ if (token.value.charCodeAt(1) !== HYPHENMINUS$1) {
+ return 0;
+ }
+
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+ // '+'? <ndashdigit-ident>
+ default:
+ if (token.value.charCodeAt(1) !== HYPHENMINUS$1) {
+ return 0;
+ }
+
+ return checkInteger(token, 2, DISALLOW_SIGN, offset);
+ }
+ }
+
+ // <ndashdigit-dimension>
+ // <ndash-dimension> <signless-integer>
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ else if (token.type === DIMENSION) {
+ var code = token.value.charCodeAt(0);
+ var sign = code === PLUSSIGN || code === HYPHENMINUS$1 ? 1 : 0;
+
+ for (var i = sign; i < token.value.length; i++) {
+ if (!isDigit$2(token.value.charCodeAt(i))) {
+ break;
+ }
+ }
+
+ if (i === sign) {
+ // Integer is expected
+ return 0;
+ }
+
+ if (!cmpChar$1(token.value, i, N)) {
+ return 0;
+ }
+
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ if (i + 1 === token.value.length) {
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+ } else {
+ if (token.value.charCodeAt(i + 1) !== HYPHENMINUS$1) {
+ return 0;
+ }
+
+ // <ndash-dimension> <signless-integer>
+ if (i + 2 === token.value.length) {
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+ }
+ // <ndashdigit-dimension>
+ else {
+ return checkInteger(token, i + 2, DISALLOW_SIGN, offset);
+ }
+ }
+ }
+
+ return 0;
+ };
+
+ var isHexDigit$2 = tokenizer.isHexDigit;
+ var cmpChar$2 = tokenizer.cmpChar;
+ var TYPE$4 = tokenizer.TYPE;
+
+ var IDENT$1 = TYPE$4.Ident;
+ var DELIM$1 = TYPE$4.Delim;
+ var NUMBER$1 = TYPE$4.Number;
+ var DIMENSION$1 = TYPE$4.Dimension;
+ var PLUSSIGN$1 = 0x002B; // U+002B PLUS SIGN (+)
+ var HYPHENMINUS$2 = 0x002D; // U+002D HYPHEN-MINUS (-)
+ var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+ var U = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+ function isDelim$1(token, code) {
+ return token !== null && token.type === DELIM$1 && token.value.charCodeAt(0) === code;
+ }
+
+ function startsWith(token, code) {
+ return token.value.charCodeAt(0) === code;
+ }
+
+ function hexSequence(token, offset, allowDash) {
+ for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) {
+ var code = token.value.charCodeAt(pos);
+
+ if (code === HYPHENMINUS$2 && allowDash && hexlen !== 0) {
+ if (hexSequence(token, offset + hexlen + 1, false) > 0) {
+ return 6; // dissallow following question marks
+ }
+
+ return 0; // dash at the ending of a hex sequence is not allowed
+ }
+
+ if (!isHexDigit$2(code)) {
+ return 0; // not a hex digit
+ }
+
+ if (++hexlen > 6) {
+ return 0; // too many hex digits
+ } }
+
+ return hexlen;
+ }
+
+ function withQuestionMarkSequence(consumed, length, getNextToken) {
+ if (!consumed) {
+ return 0; // nothing consumed
+ }
+
+ while (isDelim$1(getNextToken(length), QUESTIONMARK)) {
+ if (++consumed > 6) {
+ return 0; // too many question marks
+ }
+
+ length++;
+ }
+
+ return length;
+ }
+
+ // https://drafts.csswg.org/css-syntax/#urange
+ // Informally, the <urange> production has three forms:
+ // U+0001
+ // Defines a range consisting of a single code point, in this case the code point "1".
+ // U+0001-00ff
+ // Defines a range of codepoints between the first and the second value, in this case
+ // the range between "1" and "ff" (255 in decimal) inclusive.
+ // U+00??
+ // Defines a range of codepoints where the "?" characters range over all hex digits,
+ // in this case defining the same as the value U+0000-00ff.
+ // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+ //
+ // <urange> =
+ // u '+' <ident-token> '?'* |
+ // u <dimension-token> '?'* |
+ // u <number-token> '?'* |
+ // u <number-token> <dimension-token> |
+ // u <number-token> <number-token> |
+ // u '+' '?'+
+ var genericUrange = function urange(token, getNextToken) {
+ var length = 0;
+
+ // should start with `u` or `U`
+ if (token === null || token.type !== IDENT$1 || !cmpChar$2(token.value, 0, U)) {
+ return 0;
+ }
+
+ token = getNextToken(++length);
+ if (token === null) {
+ return 0;
+ }
+
+ // u '+' <ident-token> '?'*
+ // u '+' '?'+
+ if (isDelim$1(token, PLUSSIGN$1)) {
+ token = getNextToken(++length);
+ if (token === null) {
+ return 0;
+ }
+
+ if (token.type === IDENT$1) {
+ // u '+' <ident-token> '?'*
+ return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken);
+ }
+
+ if (isDelim$1(token, QUESTIONMARK)) {
+ // u '+' '?'+
+ return withQuestionMarkSequence(1, ++length, getNextToken);
+ }
+
+ // Hex digit or question mark is expected
+ return 0;
+ }
+
+ // u <number-token> '?'*
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (token.type === NUMBER$1) {
+ if (!startsWith(token, PLUSSIGN$1)) {
+ return 0;
+ }
+
+ var consumedHexLength = hexSequence(token, 1, true);
+ if (consumedHexLength === 0) {
+ return 0;
+ }
+
+ token = getNextToken(++length);
+ if (token === null) {
+ // u <number-token> <eof>
+ return length;
+ }
+
+ if (token.type === DIMENSION$1 || token.type === NUMBER$1) {
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (!startsWith(token, HYPHENMINUS$2) || !hexSequence(token, 1, false)) {
+ return 0;
+ }
+
+ return length + 1;
+ }
+
+ // u <number-token> '?'*
+ return withQuestionMarkSequence(consumedHexLength, length, getNextToken);
+ }
+
+ // u <dimension-token> '?'*
+ if (token.type === DIMENSION$1) {
+ if (!startsWith(token, PLUSSIGN$1)) {
+ return 0;
+ }
+
+ return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken);
+ }
+
+ return 0;
+ };
+
+ var isIdentifierStart$2 = tokenizer.isIdentifierStart;
+ var isHexDigit$3 = tokenizer.isHexDigit;
+ var isDigit$3 = tokenizer.isDigit;
+ var cmpStr$3 = tokenizer.cmpStr;
+ var consumeNumber$2 = tokenizer.consumeNumber;
+ var TYPE$5 = tokenizer.TYPE;
+
+
+
+ var cssWideKeywords = ['unset', 'initial', 'inherit'];
+ var calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc('];
+
+ // https://www.w3.org/TR/css-values-3/#lengths
+ var LENGTH = {
+ // absolute length units
+ 'px': true,
+ 'mm': true,
+ 'cm': true,
+ 'in': true,
+ 'pt': true,
+ 'pc': true,
+ 'q': true,
+
+ // relative length units
+ 'em': true,
+ 'ex': true,
+ 'ch': true,
+ 'rem': true,
+
+ // viewport-percentage lengths
+ 'vh': true,
+ 'vw': true,
+ 'vmin': true,
+ 'vmax': true,
+ 'vm': true
+ };
+
+ var ANGLE = {
+ 'deg': true,
+ 'grad': true,
+ 'rad': true,
+ 'turn': true
+ };
+
+ var TIME = {
+ 's': true,
+ 'ms': true
+ };
+
+ var FREQUENCY = {
+ 'hz': true,
+ 'khz': true
+ };
+
+ // https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)
+ var RESOLUTION = {
+ 'dpi': true,
+ 'dpcm': true,
+ 'dppx': true,
+ 'x': true // https://github.com/w3c/csswg-drafts/issues/461
+ };
+
+ // https://drafts.csswg.org/css-grid/#fr-unit
+ var FLEX = {
+ 'fr': true
+ };
+
+ // https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume
+ var DECIBEL = {
+ 'db': true
+ };
+
+ // https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch
+ var SEMITONES = {
+ 'st': true
+ };
+
+ // safe char code getter
+ function charCode(str, index) {
+ return index < str.length ? str.charCodeAt(index) : 0;
+ }
+
+ function eqStr(actual, expected) {
+ return cmpStr$3(actual, 0, actual.length, expected);
+ }
+
+ function eqStrAny(actual, expected) {
+ for (var i = 0; i < expected.length; i++) {
+ if (eqStr(actual, expected[i])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ // IE postfix hack, i.e. 123\0 or 123px\9
+ function isPostfixIeHack(str, offset) {
+ if (offset !== str.length - 2) {
+ return false;
+ }
+
+ return (
+ str.charCodeAt(offset) === 0x005C && // U+005C REVERSE SOLIDUS (\)
+ isDigit$3(str.charCodeAt(offset + 1))
+ );
+ }
+
+ function outOfRange(opts, value, numEnd) {
+ if (opts && opts.type === 'Range') {
+ var num = Number(
+ numEnd !== undefined && numEnd !== value.length
+ ? value.substr(0, numEnd)
+ : value
+ );
+
+ if (isNaN(num)) {
+ return true;
+ }
+
+ if (opts.min !== null && num < opts.min) {
+ return true;
+ }
+
+ if (opts.max !== null && num > opts.max) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function consumeFunction(token, getNextToken) {
+ var startIdx = token.index;
+ var length = 0;
+
+ // balanced token consuming
+ do {
+ length++;
+
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+ }
+
+ // TODO: implement
+ // can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed
+ // https://drafts.csswg.org/css-values/#calc-notation
+ function calc(next) {
+ return function(token, getNextToken, opts) {
+ if (token === null) {
+ return 0;
+ }
+
+ if (token.type === TYPE$5.Function && eqStrAny(token.value, calcFunctionNames)) {
+ return consumeFunction(token, getNextToken);
+ }
+
+ return next(token, getNextToken, opts);
+ };
+ }
+
+ function tokenType(expectedTokenType) {
+ return function(token) {
+ if (token === null || token.type !== expectedTokenType) {
+ return 0;
+ }
+
+ return 1;
+ };
+ }
+
+ function func(name) {
+ name = name + '(';
+
+ return function(token, getNextToken) {
+ if (token !== null && eqStr(token.value, name)) {
+ return consumeFunction(token, getNextToken);
+ }
+
+ return 0;
+ };
+ }
+
+ // =========================
+ // Complex types
+ //
+
+ // https://drafts.csswg.org/css-values-4/#custom-idents
+ // 4.2. Author-defined Identifiers: the <custom-ident> type
+ // Some properties accept arbitrary author-defined identifiers as a component value.
+ // This generic data type is denoted by <custom-ident>, and represents any valid CSS identifier
+ // that would not be misinterpreted as a pre-defined keyword in that property’s value definition.
+ //
+ // See also: https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident
+ function customIdent(token) {
+ if (token === null || token.type !== TYPE$5.Ident) {
+ return 0;
+ }
+
+ var name = token.value.toLowerCase();
+
+ // The CSS-wide keywords are not valid <custom-ident>s
+ if (eqStrAny(name, cssWideKeywords)) {
+ return 0;
+ }
+
+ // The default keyword is reserved and is also not a valid <custom-ident>
+ if (eqStr(name, 'default')) {
+ return 0;
+ }
+
+ // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)
+ // Specifications using <custom-ident> must specify clearly what other keywords
+ // are excluded from <custom-ident>, if any—for example by saying that any pre-defined keywords
+ // in that property’s value definition are excluded. Excluded keywords are excluded
+ // in all ASCII case permutations.
+
+ return 1;
+ }
+
+ // https://drafts.csswg.org/css-variables/#typedef-custom-property-name
+ // A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+ // The <custom-property-name> production corresponds to this: it’s defined as any valid identifier
+ // that starts with two dashes, except -- itself, which is reserved for future use by CSS.
+ // NOTE: Current implementation treat `--` as a valid name since most (all?) major browsers treat it as valid.
+ function customPropertyName(token) {
+ // ... defined as any valid identifier
+ if (token === null || token.type !== TYPE$5.Ident) {
+ return 0;
+ }
+
+ // ... that starts with two dashes (U+002D HYPHEN-MINUS)
+ if (charCode(token.value, 0) !== 0x002D || charCode(token.value, 1) !== 0x002D) {
+ return 0;
+ }
+
+ return 1;
+ }
+
+ // https://drafts.csswg.org/css-color-4/#hex-notation
+ // The syntax of a <hex-color> is a <hash-token> token whose value consists of 3, 4, 6, or 8 hexadecimal digits.
+ // In other words, a hex color is written as a hash character, "#", followed by some number of digits 0-9 or
+ // letters a-f (the case of the letters doesn’t matter - #00ff00 is identical to #00FF00).
+ function hexColor(token) {
+ if (token === null || token.type !== TYPE$5.Hash) {
+ return 0;
+ }
+
+ var length = token.value.length;
+
+ // valid values (length): #rgb (4), #rgba (5), #rrggbb (7), #rrggbbaa (9)
+ if (length !== 4 && length !== 5 && length !== 7 && length !== 9) {
+ return 0;
+ }
+
+ for (var i = 1; i < length; i++) {
+ if (!isHexDigit$3(token.value.charCodeAt(i))) {
+ return 0;
+ }
+ }
+
+ return 1;
+ }
+
+ function idSelector(token) {
+ if (token === null || token.type !== TYPE$5.Hash) {
+ return 0;
+ }
+
+ if (!isIdentifierStart$2(charCode(token.value, 1), charCode(token.value, 2), charCode(token.value, 3))) {
+ return 0;
+ }
+
+ return 1;
+ }
+
+ // https://drafts.csswg.org/css-syntax/#any-value
+ // It represents the entirety of what a valid declaration can have as its value.
+ function declarationValue(token, getNextToken) {
+ if (!token) {
+ return 0;
+ }
+
+ var length = 0;
+ var level = 0;
+ var startIdx = token.index;
+
+ // The <declaration-value> production matches any sequence of one or more tokens,
+ // so long as the sequence ...
+ scan:
+ do {
+ switch (token.type) {
+ // ... does not contain <bad-string-token>, <bad-url-token>,
+ case TYPE$5.BadString:
+ case TYPE$5.BadUrl:
+ break scan;
+
+ // ... unmatched <)-token>, <]-token>, or <}-token>,
+ case TYPE$5.RightCurlyBracket:
+ case TYPE$5.RightParenthesis:
+ case TYPE$5.RightSquareBracket:
+ if (token.balance > token.index || token.balance < startIdx) {
+ break scan;
+ }
+
+ level--;
+ break;
+
+ // ... or top-level <semicolon-token> tokens
+ case TYPE$5.Semicolon:
+ if (level === 0) {
+ break scan;
+ }
+
+ break;
+
+ // ... or <delim-token> tokens with a value of "!"
+ case TYPE$5.Delim:
+ if (token.value === '!' && level === 0) {
+ break scan;
+ }
+
+ break;
+
+ case TYPE$5.Function:
+ case TYPE$5.LeftParenthesis:
+ case TYPE$5.LeftSquareBracket:
+ case TYPE$5.LeftCurlyBracket:
+ level++;
+ break;
+ }
+
+ length++;
+
+ // until balance closing
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+ }
+
+ // https://drafts.csswg.org/css-syntax/#any-value
+ // The <any-value> production is identical to <declaration-value>, but also
+ // allows top-level <semicolon-token> tokens and <delim-token> tokens
+ // with a value of "!". It represents the entirety of what valid CSS can be in any context.
+ function anyValue(token, getNextToken) {
+ if (!token) {
+ return 0;
+ }
+
+ var startIdx = token.index;
+ var length = 0;
+
+ // The <any-value> production matches any sequence of one or more tokens,
+ // so long as the sequence ...
+ scan:
+ do {
+ switch (token.type) {
+ // ... does not contain <bad-string-token>, <bad-url-token>,
+ case TYPE$5.BadString:
+ case TYPE$5.BadUrl:
+ break scan;
+
+ // ... unmatched <)-token>, <]-token>, or <}-token>,
+ case TYPE$5.RightCurlyBracket:
+ case TYPE$5.RightParenthesis:
+ case TYPE$5.RightSquareBracket:
+ if (token.balance > token.index || token.balance < startIdx) {
+ break scan;
+ }
+
+ break;
+ }
+
+ length++;
+
+ // until balance closing
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+ }
+
+ // =========================
+ // Dimensions
+ //
+
+ function dimension(type) {
+ return function(token, getNextToken, opts) {
+ if (token === null || token.type !== TYPE$5.Dimension) {
+ return 0;
+ }
+
+ var numberEnd = consumeNumber$2(token.value, 0);
+
+ // check unit
+ if (type !== null) {
+ // check for IE postfix hack, i.e. 123px\0 or 123px\9
+ var reverseSolidusOffset = token.value.indexOf('\\', numberEnd);
+ var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset)
+ ? token.value.substr(numberEnd)
+ : token.value.substring(numberEnd, reverseSolidusOffset);
+
+ if (type.hasOwnProperty(unit.toLowerCase()) === false) {
+ return 0;
+ }
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, numberEnd)) {
+ return 0;
+ }
+
+ return 1;
+ };
+ }
+
+ // =========================
+ // Percentage
+ //
+
+ // §5.5. Percentages: the <percentage> type
+ // https://drafts.csswg.org/css-values-4/#percentages
+ function percentage(token, getNextToken, opts) {
+ // ... corresponds to the <percentage-token> production
+ if (token === null || token.type !== TYPE$5.Percentage) {
+ return 0;
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, token.value.length - 1)) {
+ return 0;
+ }
+
+ return 1;
+ }
+
+ // =========================
+ // Numeric
+ //
+
+ // https://drafts.csswg.org/css-values-4/#numbers
+ // The value <zero> represents a literal number with the value 0. Expressions that merely
+ // evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>;
+ // only literal <number-token>s do.
+ function zero(next) {
+ if (typeof next !== 'function') {
+ next = function() {
+ return 0;
+ };
+ }
+
+ return function(token, getNextToken, opts) {
+ if (token !== null && token.type === TYPE$5.Number) {
+ if (Number(token.value) === 0) {
+ return 1;
+ }
+ }
+
+ return next(token, getNextToken, opts);
+ };
+ }
+
+ // § 5.3. Real Numbers: the <number> type
+ // https://drafts.csswg.org/css-values-4/#numbers
+ // Number values are denoted by <number>, and represent real numbers, possibly with a fractional component.
+ // ... It corresponds to the <number-token> production
+ function number(token, getNextToken, opts) {
+ if (token === null) {
+ return 0;
+ }
+
+ var numberEnd = consumeNumber$2(token.value, 0);
+ var isNumber = numberEnd === token.value.length;
+ if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) {
+ return 0;
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, numberEnd)) {
+ return 0;
+ }
+
+ return 1;
+ }
+
+ // §5.2. Integers: the <integer> type
+ // https://drafts.csswg.org/css-values-4/#integers
+ function integer(token, getNextToken, opts) {
+ // ... corresponds to a subset of the <number-token> production
+ if (token === null || token.type !== TYPE$5.Number) {
+ return 0;
+ }
+
+ // The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign.
+ var i = token.value.charCodeAt(0) === 0x002B || // U+002B PLUS SIGN (+)
+ token.value.charCodeAt(0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-)
+
+ // When written literally, an integer is one or more decimal digits 0 through 9 ...
+ for (; i < token.value.length; i++) {
+ if (!isDigit$3(token.value.charCodeAt(i))) {
+ return 0;
+ }
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, i)) {
+ return 0;
+ }
+
+ return 1;
+ }
+
+ var generic = {
+ // token types
+ 'ident-token': tokenType(TYPE$5.Ident),
+ 'function-token': tokenType(TYPE$5.Function),
+ 'at-keyword-token': tokenType(TYPE$5.AtKeyword),
+ 'hash-token': tokenType(TYPE$5.Hash),
+ 'string-token': tokenType(TYPE$5.String),
+ 'bad-string-token': tokenType(TYPE$5.BadString),
+ 'url-token': tokenType(TYPE$5.Url),
+ 'bad-url-token': tokenType(TYPE$5.BadUrl),
+ 'delim-token': tokenType(TYPE$5.Delim),
+ 'number-token': tokenType(TYPE$5.Number),
+ 'percentage-token': tokenType(TYPE$5.Percentage),
+ 'dimension-token': tokenType(TYPE$5.Dimension),
+ 'whitespace-token': tokenType(TYPE$5.WhiteSpace),
+ 'CDO-token': tokenType(TYPE$5.CDO),
+ 'CDC-token': tokenType(TYPE$5.CDC),
+ 'colon-token': tokenType(TYPE$5.Colon),
+ 'semicolon-token': tokenType(TYPE$5.Semicolon),
+ 'comma-token': tokenType(TYPE$5.Comma),
+ '[-token': tokenType(TYPE$5.LeftSquareBracket),
+ ']-token': tokenType(TYPE$5.RightSquareBracket),
+ '(-token': tokenType(TYPE$5.LeftParenthesis),
+ ')-token': tokenType(TYPE$5.RightParenthesis),
+ '{-token': tokenType(TYPE$5.LeftCurlyBracket),
+ '}-token': tokenType(TYPE$5.RightCurlyBracket),
+
+ // token type aliases
+ 'string': tokenType(TYPE$5.String),
+ 'ident': tokenType(TYPE$5.Ident),
+
+ // complex types
+ 'custom-ident': customIdent,
+ 'custom-property-name': customPropertyName,
+ 'hex-color': hexColor,
+ 'id-selector': idSelector, // element( <id-selector> )
+ 'an-plus-b': genericAnPlusB,
+ 'urange': genericUrange,
+ 'declaration-value': declarationValue,
+ 'any-value': anyValue,
+
+ // dimensions
+ 'dimension': calc(dimension(null)),
+ 'angle': calc(dimension(ANGLE)),
+ 'decibel': calc(dimension(DECIBEL)),
+ 'frequency': calc(dimension(FREQUENCY)),
+ 'flex': calc(dimension(FLEX)),
+ 'length': calc(zero(dimension(LENGTH))),
+ 'resolution': calc(dimension(RESOLUTION)),
+ 'semitones': calc(dimension(SEMITONES)),
+ 'time': calc(dimension(TIME)),
+
+ // percentage
+ 'percentage': calc(percentage),
+
+ // numeric
+ 'zero': zero(),
+ 'number': calc(number),
+ 'integer': calc(integer),
+
+ // old IE stuff
+ '-ms-legacy-expression': func('expression')
+ };
+
+ var _SyntaxError$1 = function SyntaxError(message, input, offset) {
+ var error = createCustomError('SyntaxError', message);
+
+ error.input = input;
+ error.offset = offset;
+ error.rawMessage = message;
+ error.message = error.rawMessage + '\n' +
+ ' ' + error.input + '\n' +
+ '--' + new Array((error.offset || error.input.length) + 1).join('-') + '^';
+
+ return error;
+ };
+
+ var TAB = 9;
+ var N$1 = 10;
+ var F = 12;
+ var R = 13;
+ var SPACE = 32;
+
+ var Tokenizer = function(str) {
+ this.str = str;
+ this.pos = 0;
+ };
+
+ Tokenizer.prototype = {
+ charCodeAt: function(pos) {
+ return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+ },
+ charCode: function() {
+ return this.charCodeAt(this.pos);
+ },
+ nextCharCode: function() {
+ return this.charCodeAt(this.pos + 1);
+ },
+ nextNonWsCode: function(pos) {
+ return this.charCodeAt(this.findWsEnd(pos));
+ },
+ findWsEnd: function(pos) {
+ for (; pos < this.str.length; pos++) {
+ var code = this.str.charCodeAt(pos);
+ if (code !== R && code !== N$1 && code !== F && code !== SPACE && code !== TAB) {
+ break;
+ }
+ }
+
+ return pos;
+ },
+ substringToPos: function(end) {
+ return this.str.substring(this.pos, this.pos = end);
+ },
+ eat: function(code) {
+ if (this.charCode() !== code) {
+ this.error('Expect `' + String.fromCharCode(code) + '`');
+ }
+
+ this.pos++;
+ },
+ peek: function() {
+ return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+ },
+ error: function(message) {
+ throw new _SyntaxError$1(message, this.str, this.pos);
+ }
+ };
+
+ var tokenizer$1 = Tokenizer;
+
+ var TAB$1 = 9;
+ var N$2 = 10;
+ var F$1 = 12;
+ var R$1 = 13;
+ var SPACE$1 = 32;
+ var EXCLAMATIONMARK = 33; // !
+ var NUMBERSIGN = 35; // #
+ var AMPERSAND = 38; // &
+ var APOSTROPHE = 39; // '
+ var LEFTPARENTHESIS = 40; // (
+ var RIGHTPARENTHESIS = 41; // )
+ var ASTERISK = 42; // *
+ var PLUSSIGN$2 = 43; // +
+ var COMMA = 44; // ,
+ var HYPERMINUS = 45; // -
+ var LESSTHANSIGN = 60; // <
+ var GREATERTHANSIGN = 62; // >
+ var QUESTIONMARK$1 = 63; // ?
+ var COMMERCIALAT = 64; // @
+ var LEFTSQUAREBRACKET = 91; // [
+ var RIGHTSQUAREBRACKET = 93; // ]
+ var LEFTCURLYBRACKET = 123; // {
+ var VERTICALLINE = 124; // |
+ var RIGHTCURLYBRACKET = 125; // }
+ var INFINITY = 8734; // ∞
+ var NAME_CHAR = createCharMap(function(ch) {
+ return /[a-zA-Z0-9\-]/.test(ch);
+ });
+ var COMBINATOR_PRECEDENCE = {
+ ' ': 1,
+ '&&': 2,
+ '||': 3,
+ '|': 4
+ };
+
+ function createCharMap(fn) {
+ var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);
+ for (var i = 0; i < 128; i++) {
+ array[i] = fn(String.fromCharCode(i)) ? 1 : 0;
+ }
+ return array;
+ }
+
+ function scanSpaces(tokenizer) {
+ return tokenizer.substringToPos(
+ tokenizer.findWsEnd(tokenizer.pos)
+ );
+ }
+
+ function scanWord(tokenizer) {
+ var end = tokenizer.pos;
+
+ for (; end < tokenizer.str.length; end++) {
+ var code = tokenizer.str.charCodeAt(end);
+ if (code >= 128 || NAME_CHAR[code] === 0) {
+ break;
+ }
+ }
+
+ if (tokenizer.pos === end) {
+ tokenizer.error('Expect a keyword');
+ }
+
+ return tokenizer.substringToPos(end);
+ }
+
+ function scanNumber(tokenizer) {
+ var end = tokenizer.pos;
+
+ for (; end < tokenizer.str.length; end++) {
+ var code = tokenizer.str.charCodeAt(end);
+ if (code < 48 || code > 57) {
+ break;
+ }
+ }
+
+ if (tokenizer.pos === end) {
+ tokenizer.error('Expect a number');
+ }
+
+ return tokenizer.substringToPos(end);
+ }
+
+ function scanString(tokenizer) {
+ var end = tokenizer.str.indexOf('\'', tokenizer.pos + 1);
+
+ if (end === -1) {
+ tokenizer.pos = tokenizer.str.length;
+ tokenizer.error('Expect an apostrophe');
+ }
+
+ return tokenizer.substringToPos(end + 1);
+ }
+
+ function readMultiplierRange(tokenizer) {
+ var min = null;
+ var max = null;
+
+ tokenizer.eat(LEFTCURLYBRACKET);
+
+ min = scanNumber(tokenizer);
+
+ if (tokenizer.charCode() === COMMA) {
+ tokenizer.pos++;
+ if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {
+ max = scanNumber(tokenizer);
+ }
+ } else {
+ max = min;
+ }
+
+ tokenizer.eat(RIGHTCURLYBRACKET);
+
+ return {
+ min: Number(min),
+ max: max ? Number(max) : 0
+ };
+ }
+
+ function readMultiplier(tokenizer) {
+ var range = null;
+ var comma = false;
+
+ switch (tokenizer.charCode()) {
+ case ASTERISK:
+ tokenizer.pos++;
+
+ range = {
+ min: 0,
+ max: 0
+ };
+
+ break;
+
+ case PLUSSIGN$2:
+ tokenizer.pos++;
+
+ range = {
+ min: 1,
+ max: 0
+ };
+
+ break;
+
+ case QUESTIONMARK$1:
+ tokenizer.pos++;
+
+ range = {
+ min: 0,
+ max: 1
+ };
+
+ break;
+
+ case NUMBERSIGN:
+ tokenizer.pos++;
+
+ comma = true;
+
+ if (tokenizer.charCode() === LEFTCURLYBRACKET) {
+ range = readMultiplierRange(tokenizer);
+ } else {
+ range = {
+ min: 1,
+ max: 0
+ };
+ }
+
+ break;
+
+ case LEFTCURLYBRACKET:
+ range = readMultiplierRange(tokenizer);
+ break;
+
+ default:
+ return null;
+ }
+
+ return {
+ type: 'Multiplier',
+ comma: comma,
+ min: range.min,
+ max: range.max,
+ term: null
+ };
+ }
+
+ function maybeMultiplied(tokenizer, node) {
+ var multiplier = readMultiplier(tokenizer);
+
+ if (multiplier !== null) {
+ multiplier.term = node;
+ return multiplier;
+ }
+
+ return node;
+ }
+
+ function maybeToken(tokenizer) {
+ var ch = tokenizer.peek();
+
+ if (ch === '') {
+ return null;
+ }
+
+ return {
+ type: 'Token',
+ value: ch
+ };
+ }
+
+ function readProperty(tokenizer) {
+ var name;
+
+ tokenizer.eat(LESSTHANSIGN);
+ tokenizer.eat(APOSTROPHE);
+
+ name = scanWord(tokenizer);
+
+ tokenizer.eat(APOSTROPHE);
+ tokenizer.eat(GREATERTHANSIGN);
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Property',
+ name: name
+ });
+ }
+
+ // https://drafts.csswg.org/css-values-3/#numeric-ranges
+ // 4.1. Range Restrictions and Range Definition Notation
+ //
+ // Range restrictions can be annotated in the numeric type notation using CSS bracketed
+ // range notation—[min,max]—within the angle brackets, after the identifying keyword,
+ // indicating a closed range between (and including) min and max.
+ // For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.
+ function readTypeRange(tokenizer) {
+ // use null for Infinity to make AST format JSON serializable/deserializable
+ var min = null; // -Infinity
+ var max = null; // Infinity
+ var sign = 1;
+
+ tokenizer.eat(LEFTSQUAREBRACKET);
+
+ if (tokenizer.charCode() === HYPERMINUS) {
+ tokenizer.peek();
+ sign = -1;
+ }
+
+ if (sign == -1 && tokenizer.charCode() === INFINITY) {
+ tokenizer.peek();
+ } else {
+ min = sign * Number(scanNumber(tokenizer));
+ }
+
+ scanSpaces(tokenizer);
+ tokenizer.eat(COMMA);
+ scanSpaces(tokenizer);
+
+ if (tokenizer.charCode() === INFINITY) {
+ tokenizer.peek();
+ } else {
+ sign = 1;
+
+ if (tokenizer.charCode() === HYPERMINUS) {
+ tokenizer.peek();
+ sign = -1;
+ }
+
+ max = sign * Number(scanNumber(tokenizer));
+ }
+
+ tokenizer.eat(RIGHTSQUAREBRACKET);
+
+ // If no range is indicated, either by using the bracketed range notation
+ // or in the property description, then [−∞,∞] is assumed.
+ if (min === null && max === null) {
+ return null;
+ }
+
+ return {
+ type: 'Range',
+ min: min,
+ max: max
+ };
+ }
+
+ function readType(tokenizer) {
+ var name;
+ var opts = null;
+
+ tokenizer.eat(LESSTHANSIGN);
+ name = scanWord(tokenizer);
+
+ if (tokenizer.charCode() === LEFTPARENTHESIS &&
+ tokenizer.nextCharCode() === RIGHTPARENTHESIS) {
+ tokenizer.pos += 2;
+ name += '()';
+ }
+
+ if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) {
+ scanSpaces(tokenizer);
+ opts = readTypeRange(tokenizer);
+ }
+
+ tokenizer.eat(GREATERTHANSIGN);
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Type',
+ name: name,
+ opts: opts
+ });
+ }
+
+ function readKeywordOrFunction(tokenizer) {
+ var name;
+
+ name = scanWord(tokenizer);
+
+ if (tokenizer.charCode() === LEFTPARENTHESIS) {
+ tokenizer.pos++;
+
+ return {
+ type: 'Function',
+ name: name
+ };
+ }
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Keyword',
+ name: name
+ });
+ }
+
+ function regroupTerms(terms, combinators) {
+ function createGroup(terms, combinator) {
+ return {
+ type: 'Group',
+ terms: terms,
+ combinator: combinator,
+ disallowEmpty: false,
+ explicit: false
+ };
+ }
+
+ combinators = Object.keys(combinators).sort(function(a, b) {
+ return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];
+ });
+
+ while (combinators.length > 0) {
+ var combinator = combinators.shift();
+ for (var i = 0, subgroupStart = 0; i < terms.length; i++) {
+ var term = terms[i];
+ if (term.type === 'Combinator') {
+ if (term.value === combinator) {
+ if (subgroupStart === -1) {
+ subgroupStart = i - 1;
+ }
+ terms.splice(i, 1);
+ i--;
+ } else {
+ if (subgroupStart !== -1 && i - subgroupStart > 1) {
+ terms.splice(
+ subgroupStart,
+ i - subgroupStart,
+ createGroup(terms.slice(subgroupStart, i), combinator)
+ );
+ i = subgroupStart + 1;
+ }
+ subgroupStart = -1;
+ }
+ }
+ }
+
+ if (subgroupStart !== -1 && combinators.length) {
+ terms.splice(
+ subgroupStart,
+ i - subgroupStart,
+ createGroup(terms.slice(subgroupStart, i), combinator)
+ );
+ }
+ }
+
+ return combinator;
+ }
+
+ function readImplicitGroup(tokenizer) {
+ var terms = [];
+ var combinators = {};
+ var token;
+ var prevToken = null;
+ var prevTokenPos = tokenizer.pos;
+
+ while (token = peek(tokenizer)) {
+ if (token.type !== 'Spaces') {
+ if (token.type === 'Combinator') {
+ // check for combinator in group beginning and double combinator sequence
+ if (prevToken === null || prevToken.type === 'Combinator') {
+ tokenizer.pos = prevTokenPos;
+ tokenizer.error('Unexpected combinator');
+ }
+
+ combinators[token.value] = true;
+ } else if (prevToken !== null && prevToken.type !== 'Combinator') {
+ combinators[' '] = true; // a b
+ terms.push({
+ type: 'Combinator',
+ value: ' '
+ });
+ }
+
+ terms.push(token);
+ prevToken = token;
+ prevTokenPos = tokenizer.pos;
+ }
+ }
+
+ // check for combinator in group ending
+ if (prevToken !== null && prevToken.type === 'Combinator') {
+ tokenizer.pos -= prevTokenPos;
+ tokenizer.error('Unexpected combinator');
+ }
+
+ return {
+ type: 'Group',
+ terms: terms,
+ combinator: regroupTerms(terms, combinators) || ' ',
+ disallowEmpty: false,
+ explicit: false
+ };
+ }
+
+ function readGroup(tokenizer) {
+ var result;
+
+ tokenizer.eat(LEFTSQUAREBRACKET);
+ result = readImplicitGroup(tokenizer);
+ tokenizer.eat(RIGHTSQUAREBRACKET);
+
+ result.explicit = true;
+
+ if (tokenizer.charCode() === EXCLAMATIONMARK) {
+ tokenizer.pos++;
+ result.disallowEmpty = true;
+ }
+
+ return result;
+ }
+
+ function peek(tokenizer) {
+ var code = tokenizer.charCode();
+
+ if (code < 128 && NAME_CHAR[code] === 1) {
+ return readKeywordOrFunction(tokenizer);
+ }
+
+ switch (code) {
+ case RIGHTSQUAREBRACKET:
+ // don't eat, stop scan a group
+ break;
+
+ case LEFTSQUAREBRACKET:
+ return maybeMultiplied(tokenizer, readGroup(tokenizer));
+
+ case LESSTHANSIGN:
+ return tokenizer.nextCharCode() === APOSTROPHE
+ ? readProperty(tokenizer)
+ : readType(tokenizer);
+
+ case VERTICALLINE:
+ return {
+ type: 'Combinator',
+ value: tokenizer.substringToPos(
+ tokenizer.nextCharCode() === VERTICALLINE
+ ? tokenizer.pos + 2
+ : tokenizer.pos + 1
+ )
+ };
+
+ case AMPERSAND:
+ tokenizer.pos++;
+ tokenizer.eat(AMPERSAND);
+
+ return {
+ type: 'Combinator',
+ value: '&&'
+ };
+
+ case COMMA:
+ tokenizer.pos++;
+ return {
+ type: 'Comma'
+ };
+
+ case APOSTROPHE:
+ return maybeMultiplied(tokenizer, {
+ type: 'String',
+ value: scanString(tokenizer)
+ });
+
+ case SPACE$1:
+ case TAB$1:
+ case N$2:
+ case R$1:
+ case F$1:
+ return {
+ type: 'Spaces',
+ value: scanSpaces(tokenizer)
+ };
+
+ case COMMERCIALAT:
+ code = tokenizer.nextCharCode();
+
+ if (code < 128 && NAME_CHAR[code] === 1) {
+ tokenizer.pos++;
+ return {
+ type: 'AtKeyword',
+ name: scanWord(tokenizer)
+ };
+ }
+
+ return maybeToken(tokenizer);
+
+ case ASTERISK:
+ case PLUSSIGN$2:
+ case QUESTIONMARK$1:
+ case NUMBERSIGN:
+ case EXCLAMATIONMARK:
+ // prohibited tokens (used as a multiplier start)
+ break;
+
+ case LEFTCURLYBRACKET:
+ // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting
+ // check next char isn't a number, because it's likely a disjoined multiplier
+ code = tokenizer.nextCharCode();
+
+ if (code < 48 || code > 57) {
+ return maybeToken(tokenizer);
+ }
+
+ break;
+
+ default:
+ return maybeToken(tokenizer);
+ }
+ }
+
+ function parse(source) {
+ var tokenizer = new tokenizer$1(source);
+ var result = readImplicitGroup(tokenizer);
+
+ if (tokenizer.pos !== source.length) {
+ tokenizer.error('Unexpected input');
+ }
+
+ // reduce redundant groups with single group term
+ if (result.terms.length === 1 && result.terms[0].type === 'Group') {
+ result = result.terms[0];
+ }
+
+ return result;
+ }
+
+ // warm up parse to elimitate code branches that never execute
+ // fix soft deoptimizations (insufficient type feedback)
+ parse('[a&&<b>#|<\'c\'>*||e() f{2} /,(% g#{1,2} h{2,})]!');
+
+ var parse_1 = parse;
+
+ var noop$1 = function() {};
+
+ function ensureFunction(value) {
+ return typeof value === 'function' ? value : noop$1;
+ }
+
+ var walk = function(node, options, context) {
+ function walk(node) {
+ enter.call(context, node);
+
+ switch (node.type) {
+ case 'Group':
+ node.terms.forEach(walk);
+ break;
+
+ case 'Multiplier':
+ walk(node.term);
+ break;
+
+ case 'Type':
+ case 'Property':
+ case 'Keyword':
+ case 'AtKeyword':
+ case 'Function':
+ case 'String':
+ case 'Token':
+ case 'Comma':
+ break;
+
+ default:
+ throw new Error('Unknown type: ' + node.type);
+ }
+
+ leave.call(context, node);
+ }
+
+ var enter = noop$1;
+ var leave = noop$1;
+
+ if (typeof options === 'function') {
+ enter = options;
+ } else if (options) {
+ enter = ensureFunction(options.enter);
+ leave = ensureFunction(options.leave);
+ }
+
+ if (enter === noop$1 && leave === noop$1) {
+ throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+ }
+
+ walk(node);
+ };
+
+ var tokenStream = new TokenStream_1();
+ var astToTokens = {
+ decorator: function(handlers) {
+ var curNode = null;
+ var prev = { len: 0, node: null };
+ var nodes = [prev];
+ var buffer = '';
+
+ return {
+ children: handlers.children,
+ node: function(node) {
+ var tmp = curNode;
+ curNode = node;
+ handlers.node.call(this, node);
+ curNode = tmp;
+ },
+ chunk: function(chunk) {
+ buffer += chunk;
+ if (prev.node !== curNode) {
+ nodes.push({
+ len: chunk.length,
+ node: curNode
+ });
+ } else {
+ prev.len += chunk.length;
+ }
+ },
+ result: function() {
+ return prepareTokens(buffer, nodes);
+ }
+ };
+ }
+ };
+
+ function prepareTokens(str, nodes) {
+ var tokens = [];
+ var nodesOffset = 0;
+ var nodesIndex = 0;
+ var currentNode = nodes ? nodes[nodesIndex].node : null;
+
+ tokenizer(str, tokenStream);
+
+ while (!tokenStream.eof) {
+ if (nodes) {
+ while (nodesIndex < nodes.length && nodesOffset + nodes[nodesIndex].len <= tokenStream.tokenStart) {
+ nodesOffset += nodes[nodesIndex++].len;
+ currentNode = nodes[nodesIndex].node;
+ }
+ }
+
+ tokens.push({
+ type: tokenStream.tokenType,
+ value: tokenStream.getTokenValue(),
+ index: tokenStream.tokenIndex, // TODO: remove it, temporary solution
+ balance: tokenStream.balance[tokenStream.tokenIndex], // TODO: remove it, temporary solution
+ node: currentNode
+ });
+ tokenStream.next();
+ // console.log({ ...tokens[tokens.length - 1], node: undefined });
+ }
+
+ return tokens;
+ }
+
+ var prepareTokens_1 = function(value, syntax) {
+ if (typeof value === 'string') {
+ return prepareTokens(value, null);
+ }
+
+ return syntax.generate(value, astToTokens);
+ };
+
+ var MATCH = { type: 'Match' };
+ var MISMATCH = { type: 'Mismatch' };
+ var DISALLOW_EMPTY = { type: 'DisallowEmpty' };
+ var LEFTPARENTHESIS$1 = 40; // (
+ var RIGHTPARENTHESIS$1 = 41; // )
+
+ function createCondition(match, thenBranch, elseBranch) {
+ // reduce node count
+ if (thenBranch === MATCH && elseBranch === MISMATCH) {
+ return match;
+ }
+
+ if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {
+ return match;
+ }
+
+ if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {
+ thenBranch = match.then;
+ match = match.match;
+ }
+
+ return {
+ type: 'If',
+ match: match,
+ then: thenBranch,
+ else: elseBranch
+ };
+ }
+
+ function isFunctionType(name) {
+ return (
+ name.length > 2 &&
+ name.charCodeAt(name.length - 2) === LEFTPARENTHESIS$1 &&
+ name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS$1
+ );
+ }
+
+ function isEnumCapatible(term) {
+ return (
+ term.type === 'Keyword' ||
+ term.type === 'AtKeyword' ||
+ term.type === 'Function' ||
+ term.type === 'Type' && isFunctionType(term.name)
+ );
+ }
+
+ function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {
+ switch (combinator) {
+ case ' ':
+ // Juxtaposing components means that all of them must occur, in the given order.
+ //
+ // a b c
+ // =
+ // match a
+ // then match b
+ // then match c
+ // then MATCH
+ // else MISMATCH
+ // else MISMATCH
+ // else MISMATCH
+ var result = MATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+
+ result = createCondition(
+ term,
+ result,
+ MISMATCH
+ );
+ }
+ return result;
+
+ case '|':
+ // A bar (|) separates two or more alternatives: exactly one of them must occur.
+ //
+ // a | b | c
+ // =
+ // match a
+ // then MATCH
+ // else match b
+ // then MATCH
+ // else match c
+ // then MATCH
+ // else MISMATCH
+
+ var result = MISMATCH;
+ var map = null;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+
+ // reduce sequence of keywords into a Enum
+ if (isEnumCapatible(term)) {
+ if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {
+ map = Object.create(null);
+ result = createCondition(
+ {
+ type: 'Enum',
+ map: map
+ },
+ MATCH,
+ result
+ );
+ }
+
+ if (map !== null) {
+ var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();
+ if (key in map === false) {
+ map[key] = term;
+ continue;
+ }
+ }
+ }
+
+ map = null;
+
+ // create a new conditonal node
+ result = createCondition(
+ term,
+ MATCH,
+ result
+ );
+ }
+ return result;
+
+ case '&&':
+ // A double ampersand (&&) separates two or more components,
+ // all of which must occur, in any order.
+
+ // Use MatchOnce for groups with a large number of terms,
+ // since &&-groups produces at least N!-node trees
+ if (terms.length > 5) {
+ return {
+ type: 'MatchOnce',
+ terms: terms,
+ all: true
+ };
+ }
+
+ // Use a combination tree for groups with small number of terms
+ //
+ // a && b && c
+ // =
+ // match a
+ // then [b && c]
+ // else match b
+ // then [a && c]
+ // else match c
+ // then [a && b]
+ // else MISMATCH
+ //
+ // a && b
+ // =
+ // match a
+ // then match b
+ // then MATCH
+ // else MISMATCH
+ // else match b
+ // then match a
+ // then MATCH
+ // else MISMATCH
+ // else MISMATCH
+ var result = MISMATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+ var thenClause;
+
+ if (terms.length > 1) {
+ thenClause = buildGroupMatchGraph(
+ combinator,
+ terms.filter(function(newGroupTerm) {
+ return newGroupTerm !== term;
+ }),
+ false
+ );
+ } else {
+ thenClause = MATCH;
+ }
+
+ result = createCondition(
+ term,
+ thenClause,
+ result
+ );
+ }
+ return result;
+
+ case '||':
+ // A double bar (||) separates two or more options:
+ // one or more of them must occur, in any order.
+
+ // Use MatchOnce for groups with a large number of terms,
+ // since ||-groups produces at least N!-node trees
+ if (terms.length > 5) {
+ return {
+ type: 'MatchOnce',
+ terms: terms,
+ all: false
+ };
+ }
+
+ // Use a combination tree for groups with small number of terms
+ //
+ // a || b || c
+ // =
+ // match a
+ // then [b || c]
+ // else match b
+ // then [a || c]
+ // else match c
+ // then [a || b]
+ // else MISMATCH
+ //
+ // a || b
+ // =
+ // match a
+ // then match b
+ // then MATCH
+ // else MATCH
+ // else match b
+ // then match a
+ // then MATCH
+ // else MATCH
+ // else MISMATCH
+ var result = atLeastOneTermMatched ? MATCH : MISMATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+ var thenClause;
+
+ if (terms.length > 1) {
+ thenClause = buildGroupMatchGraph(
+ combinator,
+ terms.filter(function(newGroupTerm) {
+ return newGroupTerm !== term;
+ }),
+ true
+ );
+ } else {
+ thenClause = MATCH;
+ }
+
+ result = createCondition(
+ term,
+ thenClause,
+ result
+ );
+ }
+ return result;
+ }
+ }
+
+ function buildMultiplierMatchGraph(node) {
+ var result = MATCH;
+ var matchTerm = buildMatchGraph(node.term);
+
+ if (node.max === 0) {
+ // disable repeating of empty match to prevent infinite loop
+ matchTerm = createCondition(
+ matchTerm,
+ DISALLOW_EMPTY,
+ MISMATCH
+ );
+
+ // an occurrence count is not limited, make a cycle;
+ // to collect more terms on each following matching mismatch
+ result = createCondition(
+ matchTerm,
+ null, // will be a loop
+ MISMATCH
+ );
+
+ result.then = createCondition(
+ MATCH,
+ MATCH,
+ result // make a loop
+ );
+
+ if (node.comma) {
+ result.then.else = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+ } else {
+ // create a match node chain for [min .. max] interval with optional matches
+ for (var i = node.min || 1; i <= node.max; i++) {
+ if (node.comma && result !== MATCH) {
+ result = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+
+ result = createCondition(
+ matchTerm,
+ createCondition(
+ MATCH,
+ MATCH,
+ result
+ ),
+ MISMATCH
+ );
+ }
+ }
+
+ if (node.min === 0) {
+ // allow zero match
+ result = createCondition(
+ MATCH,
+ MATCH,
+ result
+ );
+ } else {
+ // create a match node chain to collect [0 ... min - 1] required matches
+ for (var i = 0; i < node.min - 1; i++) {
+ if (node.comma && result !== MATCH) {
+ result = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+
+ result = createCondition(
+ matchTerm,
+ result,
+ MISMATCH
+ );
+ }
+ }
+
+ return result;
+ }
+
+ function buildMatchGraph(node) {
+ if (typeof node === 'function') {
+ return {
+ type: 'Generic',
+ fn: node
+ };
+ }
+
+ switch (node.type) {
+ case 'Group':
+ var result = buildGroupMatchGraph(
+ node.combinator,
+ node.terms.map(buildMatchGraph),
+ false
+ );
+
+ if (node.disallowEmpty) {
+ result = createCondition(
+ result,
+ DISALLOW_EMPTY,
+ MISMATCH
+ );
+ }
+
+ return result;
+
+ case 'Multiplier':
+ return buildMultiplierMatchGraph(node);
+
+ case 'Type':
+ case 'Property':
+ return {
+ type: node.type,
+ name: node.name,
+ syntax: node
+ };
+
+ case 'Keyword':
+ return {
+ type: node.type,
+ name: node.name.toLowerCase(),
+ syntax: node
+ };
+
+ case 'AtKeyword':
+ return {
+ type: node.type,
+ name: '@' + node.name.toLowerCase(),
+ syntax: node
+ };
+
+ case 'Function':
+ return {
+ type: node.type,
+ name: node.name.toLowerCase() + '(',
+ syntax: node
+ };
+
+ case 'String':
+ // convert a one char length String to a Token
+ if (node.value.length === 3) {
+ return {
+ type: 'Token',
+ value: node.value.charAt(1),
+ syntax: node
+ };
+ }
+
+ // otherwise use it as is
+ return {
+ type: node.type,
+ value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, '\''),
+ syntax: node
+ };
+
+ case 'Token':
+ return {
+ type: node.type,
+ value: node.value,
+ syntax: node
+ };
+
+ case 'Comma':
+ return {
+ type: node.type,
+ syntax: node
+ };
+
+ default:
+ throw new Error('Unknown node type:', node.type);
+ }
+ }
+
+ var matchGraph = {
+ MATCH: MATCH,
+ MISMATCH: MISMATCH,
+ DISALLOW_EMPTY: DISALLOW_EMPTY,
+ buildMatchGraph: function(syntaxTree, ref) {
+ if (typeof syntaxTree === 'string') {
+ syntaxTree = parse_1(syntaxTree);
+ }
+
+ return {
+ type: 'MatchGraph',
+ match: buildMatchGraph(syntaxTree),
+ syntax: ref || null,
+ source: syntaxTree
+ };
+ }
+ };
+
+ var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+
+ var MATCH$1 = matchGraph.MATCH;
+ var MISMATCH$1 = matchGraph.MISMATCH;
+ var DISALLOW_EMPTY$1 = matchGraph.DISALLOW_EMPTY;
+ var TYPE$6 = _const.TYPE;
+
+ var STUB = 0;
+ var TOKEN = 1;
+ var OPEN_SYNTAX = 2;
+ var CLOSE_SYNTAX = 3;
+
+ var EXIT_REASON_MATCH = 'Match';
+ var EXIT_REASON_MISMATCH = 'Mismatch';
+ var EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';
+
+ var ITERATION_LIMIT = 15000;
+ var totalIterationCount = 0;
+
+ function reverseList(list) {
+ var prev = null;
+ var next = null;
+ var item = list;
+
+ while (item !== null) {
+ next = item.prev;
+ item.prev = prev;
+ prev = item;
+ item = next;
+ }
+
+ return prev;
+ }
+
+ function areStringsEqualCaseInsensitive(testStr, referenceStr) {
+ if (testStr.length !== referenceStr.length) {
+ return false;
+ }
+
+ for (var i = 0; i < testStr.length; i++) {
+ var testCode = testStr.charCodeAt(i);
+ var referenceCode = referenceStr.charCodeAt(i);
+
+ // testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z).
+ if (testCode >= 0x0041 && testCode <= 0x005A) {
+ testCode = testCode | 32;
+ }
+
+ if (testCode !== referenceCode) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function isContextEdgeDelim(token) {
+ if (token.type !== TYPE$6.Delim) {
+ return false;
+ }
+
+ // Fix matching for unicode-range: U+30??, U+FF00-FF9F
+ // Probably we need to check out previous match instead
+ return token.value !== '?';
+ }
+
+ function isCommaContextStart(token) {
+ if (token === null) {
+ return true;
+ }
+
+ return (
+ token.type === TYPE$6.Comma ||
+ token.type === TYPE$6.Function ||
+ token.type === TYPE$6.LeftParenthesis ||
+ token.type === TYPE$6.LeftSquareBracket ||
+ token.type === TYPE$6.LeftCurlyBracket ||
+ isContextEdgeDelim(token)
+ );
+ }
+
+ function isCommaContextEnd(token) {
+ if (token === null) {
+ return true;
+ }
+
+ return (
+ token.type === TYPE$6.RightParenthesis ||
+ token.type === TYPE$6.RightSquareBracket ||
+ token.type === TYPE$6.RightCurlyBracket ||
+ token.type === TYPE$6.Delim
+ );
+ }
+
+ function internalMatch(tokens, state, syntaxes) {
+ function moveToNextToken() {
+ do {
+ tokenIndex++;
+ token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+ } while (token !== null && (token.type === TYPE$6.WhiteSpace || token.type === TYPE$6.Comment));
+ }
+
+ function getNextToken(offset) {
+ var nextIndex = tokenIndex + offset;
+
+ return nextIndex < tokens.length ? tokens[nextIndex] : null;
+ }
+
+ function stateSnapshotFromSyntax(nextState, prev) {
+ return {
+ nextState: nextState,
+ matchStack: matchStack,
+ syntaxStack: syntaxStack,
+ thenStack: thenStack,
+ tokenIndex: tokenIndex,
+ prev: prev
+ };
+ }
+
+ function pushThenStack(nextState) {
+ thenStack = {
+ nextState: nextState,
+ matchStack: matchStack,
+ syntaxStack: syntaxStack,
+ prev: thenStack
+ };
+ }
+
+ function pushElseStack(nextState) {
+ elseStack = stateSnapshotFromSyntax(nextState, elseStack);
+ }
+
+ function addTokenToMatch() {
+ matchStack = {
+ type: TOKEN,
+ syntax: state.syntax,
+ token: token,
+ prev: matchStack
+ };
+
+ moveToNextToken();
+ syntaxStash = null;
+
+ if (tokenIndex > longestMatch) {
+ longestMatch = tokenIndex;
+ }
+ }
+
+ function openSyntax() {
+ syntaxStack = {
+ syntax: state.syntax,
+ opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null,
+ prev: syntaxStack
+ };
+
+ matchStack = {
+ type: OPEN_SYNTAX,
+ syntax: state.syntax,
+ token: matchStack.token,
+ prev: matchStack
+ };
+ }
+
+ function closeSyntax() {
+ if (matchStack.type === OPEN_SYNTAX) {
+ matchStack = matchStack.prev;
+ } else {
+ matchStack = {
+ type: CLOSE_SYNTAX,
+ syntax: syntaxStack.syntax,
+ token: matchStack.token,
+ prev: matchStack
+ };
+ }
+
+ syntaxStack = syntaxStack.prev;
+ }
+
+ var syntaxStack = null;
+ var thenStack = null;
+ var elseStack = null;
+
+ // null – stashing allowed, nothing stashed
+ // false – stashing disabled, nothing stashed
+ // anithing else – fail stashable syntaxes, some syntax stashed
+ var syntaxStash = null;
+
+ var iterationCount = 0; // count iterations and prevent infinite loop
+ var exitReason = null;
+
+ var token = null;
+ var tokenIndex = -1;
+ var longestMatch = 0;
+ var matchStack = {
+ type: STUB,
+ syntax: null,
+ token: null,
+ prev: null
+ };
+
+ moveToNextToken();
+
+ while (exitReason === null && ++iterationCount < ITERATION_LIMIT) {
+ // function mapList(list, fn) {
+ // var result = [];
+ // while (list) {
+ // result.unshift(fn(list));
+ // list = list.prev;
+ // }
+ // return result;
+ // }
+ // console.log('--\n',
+ // '#' + iterationCount,
+ // require('util').inspect({
+ // match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? ({ [OPEN_SYNTAX]: '<', [CLOSE_SYNTAX]: '</' }[x.type] || x.type) + '!' + x.syntax.name : null),
+ // token: token && token.value,
+ // tokenIndex,
+ // syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '')
+ // }, { depth: null })
+ // );
+ switch (state.type) {
+ case 'Match':
+ if (thenStack === null) {
+ // turn to MISMATCH when some tokens left unmatched
+ if (token !== null) {
+ // doesn't mismatch if just one token left and it's an IE hack
+ if (tokenIndex !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) {
+ state = MISMATCH$1;
+ break;
+ }
+ }
+
+ // break the main loop, return a result - MATCH
+ exitReason = EXIT_REASON_MATCH;
+ break;
+ }
+
+ // go to next syntax (`then` branch)
+ state = thenStack.nextState;
+
+ // check match is not empty
+ if (state === DISALLOW_EMPTY$1) {
+ if (thenStack.matchStack === matchStack) {
+ state = MISMATCH$1;
+ break;
+ } else {
+ state = MATCH$1;
+ }
+ }
+
+ // close syntax if needed
+ while (thenStack.syntaxStack !== syntaxStack) {
+ closeSyntax();
+ }
+
+ // pop stack
+ thenStack = thenStack.prev;
+ break;
+
+ case 'Mismatch':
+ // when some syntax is stashed
+ if (syntaxStash !== null && syntaxStash !== false) {
+ // there is no else branches or a branch reduce match stack
+ if (elseStack === null || tokenIndex > elseStack.tokenIndex) {
+ // restore state from the stash
+ elseStack = syntaxStash;
+ syntaxStash = false; // disable stashing
+ }
+ } else if (elseStack === null) {
+ // no else branches -> break the main loop
+ // return a result - MISMATCH
+ exitReason = EXIT_REASON_MISMATCH;
+ break;
+ }
+
+ // go to next syntax (`else` branch)
+ state = elseStack.nextState;
+
+ // restore all the rest stack states
+ thenStack = elseStack.thenStack;
+ syntaxStack = elseStack.syntaxStack;
+ matchStack = elseStack.matchStack;
+ tokenIndex = elseStack.tokenIndex;
+ token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+
+ // pop stack
+ elseStack = elseStack.prev;
+ break;
+
+ case 'MatchGraph':
+ state = state.match;
+ break;
+
+ case 'If':
+ // IMPORTANT: else stack push must go first,
+ // since it stores the state of thenStack before changes
+ if (state.else !== MISMATCH$1) {
+ pushElseStack(state.else);
+ }
+
+ if (state.then !== MATCH$1) {
+ pushThenStack(state.then);
+ }
+
+ state = state.match;
+ break;
+
+ case 'MatchOnce':
+ state = {
+ type: 'MatchOnceBuffer',
+ syntax: state,
+ index: 0,
+ mask: 0
+ };
+ break;
+
+ case 'MatchOnceBuffer':
+ var terms = state.syntax.terms;
+
+ if (state.index === terms.length) {
+ // no matches at all or it's required all terms to be matched
+ if (state.mask === 0 || state.syntax.all) {
+ state = MISMATCH$1;
+ break;
+ }
+
+ // a partial match is ok
+ state = MATCH$1;
+ break;
+ }
+
+ // all terms are matched
+ if (state.mask === (1 << terms.length) - 1) {
+ state = MATCH$1;
+ break;
+ }
+
+ for (; state.index < terms.length; state.index++) {
+ var matchFlag = 1 << state.index;
+
+ if ((state.mask & matchFlag) === 0) {
+ // IMPORTANT: else stack push must go first,
+ // since it stores the state of thenStack before changes
+ pushElseStack(state);
+ pushThenStack({
+ type: 'AddMatchOnce',
+ syntax: state.syntax,
+ mask: state.mask | matchFlag
+ });
+
+ // match
+ state = terms[state.index++];
+ break;
+ }
+ }
+ break;
+
+ case 'AddMatchOnce':
+ state = {
+ type: 'MatchOnceBuffer',
+ syntax: state.syntax,
+ index: 0,
+ mask: state.mask
+ };
+ break;
+
+ case 'Enum':
+ if (token !== null) {
+ var name = token.value.toLowerCase();
+
+ // drop \0 and \9 hack from keyword name
+ if (name.indexOf('\\') !== -1) {
+ name = name.replace(/\\[09].*$/, '');
+ }
+
+ if (hasOwnProperty$1.call(state.map, name)) {
+ state = state.map[name];
+ break;
+ }
+ }
+
+ state = MISMATCH$1;
+ break;
+
+ case 'Generic':
+ var opts = syntaxStack !== null ? syntaxStack.opts : null;
+ var lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts));
+
+ if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) {
+ while (tokenIndex < lastTokenIndex) {
+ addTokenToMatch();
+ }
+
+ state = MATCH$1;
+ } else {
+ state = MISMATCH$1;
+ }
+
+ break;
+
+ case 'Type':
+ case 'Property':
+ var syntaxDict = state.type === 'Type' ? 'types' : 'properties';
+ var dictSyntax = hasOwnProperty$1.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null;
+
+ if (!dictSyntax || !dictSyntax.match) {
+ throw new Error(
+ 'Bad syntax reference: ' +
+ (state.type === 'Type'
+ ? '<' + state.name + '>'
+ : '<\'' + state.name + '\'>')
+ );
+ }
+
+ // stash a syntax for types with low priority
+ if (syntaxStash !== false && token !== null && state.type === 'Type') {
+ var lowPriorityMatching =
+ // https://drafts.csswg.org/css-values-4/#custom-idents
+ // When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production
+ // can only claim the keyword if no other unfulfilled production can claim it.
+ (state.name === 'custom-ident' && token.type === TYPE$6.Ident) ||
+
+ // https://drafts.csswg.org/css-values-4/#lengths
+ // ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height),
+ // it must parse as a <number>
+ (state.name === 'length' && token.value === '0');
+
+ if (lowPriorityMatching) {
+ if (syntaxStash === null) {
+ syntaxStash = stateSnapshotFromSyntax(state, elseStack);
+ }
+
+ state = MISMATCH$1;
+ break;
+ }
+ }
+
+ openSyntax();
+ state = dictSyntax.match;
+ break;
+
+ case 'Keyword':
+ var name = state.name;
+
+ if (token !== null) {
+ var keywordName = token.value;
+
+ // drop \0 and \9 hack from keyword name
+ if (keywordName.indexOf('\\') !== -1) {
+ keywordName = keywordName.replace(/\\[09].*$/, '');
+ }
+
+ if (areStringsEqualCaseInsensitive(keywordName, name)) {
+ addTokenToMatch();
+ state = MATCH$1;
+ break;
+ }
+ }
+
+ state = MISMATCH$1;
+ break;
+
+ case 'AtKeyword':
+ case 'Function':
+ if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) {
+ addTokenToMatch();
+ state = MATCH$1;
+ break;
+ }
+
+ state = MISMATCH$1;
+ break;
+
+ case 'Token':
+ if (token !== null && token.value === state.value) {
+ addTokenToMatch();
+ state = MATCH$1;
+ break;
+ }
+
+ state = MISMATCH$1;
+ break;
+
+ case 'Comma':
+ if (token !== null && token.type === TYPE$6.Comma) {
+ if (isCommaContextStart(matchStack.token)) {
+ state = MISMATCH$1;
+ } else {
+ addTokenToMatch();
+ state = isCommaContextEnd(token) ? MISMATCH$1 : MATCH$1;
+ }
+ } else {
+ state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH$1 : MISMATCH$1;
+ }
+
+ break;
+
+ case 'String':
+ var string = '';
+
+ for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) {
+ string += tokens[lastTokenIndex].value;
+ }
+
+ if (areStringsEqualCaseInsensitive(string, state.value)) {
+ while (tokenIndex < lastTokenIndex) {
+ addTokenToMatch();
+ }
+
+ state = MATCH$1;
+ } else {
+ state = MISMATCH$1;
+ }
+
+ break;
+
+ default:
+ throw new Error('Unknown node type: ' + state.type);
+ }
+ }
+
+ totalIterationCount += iterationCount;
+
+ switch (exitReason) {
+ case null:
+ console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');
+ exitReason = EXIT_REASON_ITERATION_LIMIT;
+ matchStack = null;
+ break;
+
+ case EXIT_REASON_MATCH:
+ while (syntaxStack !== null) {
+ closeSyntax();
+ }
+ break;
+
+ default:
+ matchStack = null;
+ }
+
+ return {
+ tokens: tokens,
+ reason: exitReason,
+ iterations: iterationCount,
+ match: matchStack,
+ longestMatch: longestMatch
+ };
+ }
+
+ function matchAsList(tokens, matchGraph, syntaxes) {
+ var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+ if (matchResult.match !== null) {
+ var item = reverseList(matchResult.match).prev;
+
+ matchResult.match = [];
+
+ while (item !== null) {
+ switch (item.type) {
+ case STUB:
+ break;
+
+ case OPEN_SYNTAX:
+ case CLOSE_SYNTAX:
+ matchResult.match.push({
+ type: item.type,
+ syntax: item.syntax
+ });
+ break;
+
+ default:
+ matchResult.match.push({
+ token: item.token.value,
+ node: item.token.node
+ });
+ break;
+ }
+
+ item = item.prev;
+ }
+ }
+
+ return matchResult;
+ }
+
+ function matchAsTree(tokens, matchGraph, syntaxes) {
+ var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+ if (matchResult.match === null) {
+ return matchResult;
+ }
+
+ var item = matchResult.match;
+ var host = matchResult.match = {
+ syntax: matchGraph.syntax || null,
+ match: []
+ };
+ var hostStack = [host];
+
+ // revert a list and start with 2nd item since 1st is a stub item
+ item = reverseList(item).prev;
+
+ // build a tree
+ while (item !== null) {
+ switch (item.type) {
+ case OPEN_SYNTAX:
+ host.match.push(host = {
+ syntax: item.syntax,
+ match: []
+ });
+ hostStack.push(host);
+ break;
+
+ case CLOSE_SYNTAX:
+ hostStack.pop();
+ host = hostStack[hostStack.length - 1];
+ break;
+
+ default:
+ host.match.push({
+ syntax: item.syntax || null,
+ token: item.token.value,
+ node: item.token.node
+ });
+ }
+
+ item = item.prev;
+ }
+
+ return matchResult;
+ }
+
+ var match = {
+ matchAsList: matchAsList,
+ matchAsTree: matchAsTree,
+ getTotalIterationCount: function() {
+ return totalIterationCount;
+ }
+ };
+
+ function getTrace(node) {
+ function shouldPutToTrace(syntax) {
+ if (syntax === null) {
+ return false;
+ }
+
+ return (
+ syntax.type === 'Type' ||
+ syntax.type === 'Property' ||
+ syntax.type === 'Keyword'
+ );
+ }
+
+ function hasMatch(matchNode) {
+ if (Array.isArray(matchNode.match)) {
+ // use for-loop for better perfomance
+ for (var i = 0; i < matchNode.match.length; i++) {
+ if (hasMatch(matchNode.match[i])) {
+ if (shouldPutToTrace(matchNode.syntax)) {
+ result.unshift(matchNode.syntax);
+ }
+
+ return true;
+ }
+ }
+ } else if (matchNode.node === node) {
+ result = shouldPutToTrace(matchNode.syntax)
+ ? [matchNode.syntax]
+ : [];
+
+ return true;
+ }
+
+ return false;
+ }
+
+ var result = null;
+
+ if (this.matched !== null) {
+ hasMatch(this.matched);
+ }
+
+ return result;
+ }
+
+ function testNode(match, node, fn) {
+ var trace = getTrace.call(match, node);
+
+ if (trace === null) {
+ return false;
+ }
+
+ return trace.some(fn);
+ }
+
+ function isType(node, type) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Type' && matchNode.name === type;
+ });
+ }
+
+ function isProperty(node, property) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Property' && matchNode.name === property;
+ });
+ }
+
+ function isKeyword(node) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Keyword';
+ });
+ }
+
+ var trace = {
+ getTrace: getTrace,
+ isType: isType,
+ isProperty: isProperty,
+ isKeyword: isKeyword
+ };
+
+ function getFirstMatchNode(matchNode) {
+ if ('node' in matchNode) {
+ return matchNode.node;
+ }
+
+ return getFirstMatchNode(matchNode.match[0]);
+ }
+
+ function getLastMatchNode(matchNode) {
+ if ('node' in matchNode) {
+ return matchNode.node;
+ }
+
+ return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);
+ }
+
+ function matchFragments(lexer, ast, match, type, name) {
+ function findFragments(matchNode) {
+ if (matchNode.syntax !== null &&
+ matchNode.syntax.type === type &&
+ matchNode.syntax.name === name) {
+ var start = getFirstMatchNode(matchNode);
+ var end = getLastMatchNode(matchNode);
+
+ lexer.syntax.walk(ast, function(node, item, list) {
+ if (node === start) {
+ var nodes = new List_1();
+
+ do {
+ nodes.appendData(item.data);
+
+ if (item.data === end) {
+ break;
+ }
+
+ item = item.next;
+ } while (item !== null);
+
+ fragments.push({
+ parent: list,
+ nodes: nodes
+ });
+ }
+ });
+ }
+
+ if (Array.isArray(matchNode.match)) {
+ matchNode.match.forEach(findFragments);
+ }
+ }
+
+ var fragments = [];
+
+ if (match.matched !== null) {
+ findFragments(match.matched);
+ }
+
+ return fragments;
+ }
+
+ var search = {
+ matchFragments: matchFragments
+ };
+
+ var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+
+ function isValidNumber(value) {
+ // Number.isInteger(value) && value >= 0
+ return (
+ typeof value === 'number' &&
+ isFinite(value) &&
+ Math.floor(value) === value &&
+ value >= 0
+ );
+ }
+
+ function isValidLocation(loc) {
+ return (
+ Boolean(loc) &&
+ isValidNumber(loc.offset) &&
+ isValidNumber(loc.line) &&
+ isValidNumber(loc.column)
+ );
+ }
+
+ function createNodeStructureChecker(type, fields) {
+ return function checkNode(node, warn) {
+ if (!node || node.constructor !== Object) {
+ return warn(node, 'Type of node should be an Object');
+ }
+
+ for (var key in node) {
+ var valid = true;
+
+ if (hasOwnProperty$2.call(node, key) === false) {
+ continue;
+ }
+
+ if (key === 'type') {
+ if (node.type !== type) {
+ warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');
+ }
+ } else if (key === 'loc') {
+ if (node.loc === null) {
+ continue;
+ } else if (node.loc && node.loc.constructor === Object) {
+ if (typeof node.loc.source !== 'string') {
+ key += '.source';
+ } else if (!isValidLocation(node.loc.start)) {
+ key += '.start';
+ } else if (!isValidLocation(node.loc.end)) {
+ key += '.end';
+ } else {
+ continue;
+ }
+ }
+
+ valid = false;
+ } else if (fields.hasOwnProperty(key)) {
+ for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {
+ var fieldType = fields[key][i];
+
+ switch (fieldType) {
+ case String:
+ valid = typeof node[key] === 'string';
+ break;
+
+ case Boolean:
+ valid = typeof node[key] === 'boolean';
+ break;
+
+ case null:
+ valid = node[key] === null;
+ break;
+
+ default:
+ if (typeof fieldType === 'string') {
+ valid = node[key] && node[key].type === fieldType;
+ } else if (Array.isArray(fieldType)) {
+ valid = node[key] instanceof List_1;
+ }
+ }
+ }
+ } else {
+ warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');
+ }
+
+ if (!valid) {
+ warn(node, 'Bad value for `' + type + '.' + key + '`');
+ }
+ }
+
+ for (var key in fields) {
+ if (hasOwnProperty$2.call(fields, key) &&
+ hasOwnProperty$2.call(node, key) === false) {
+ warn(node, 'Field `' + type + '.' + key + '` is missed');
+ }
+ }
+ };
+ }
+
+ function processStructure(name, nodeType) {
+ var structure = nodeType.structure;
+ var fields = {
+ type: String,
+ loc: true
+ };
+ var docs = {
+ type: '"' + name + '"'
+ };
+
+ for (var key in structure) {
+ if (hasOwnProperty$2.call(structure, key) === false) {
+ continue;
+ }
+
+ var docsTypes = [];
+ var fieldTypes = fields[key] = Array.isArray(structure[key])
+ ? structure[key].slice()
+ : [structure[key]];
+
+ for (var i = 0; i < fieldTypes.length; i++) {
+ var fieldType = fieldTypes[i];
+ if (fieldType === String || fieldType === Boolean) {
+ docsTypes.push(fieldType.name);
+ } else if (fieldType === null) {
+ docsTypes.push('null');
+ } else if (typeof fieldType === 'string') {
+ docsTypes.push('<' + fieldType + '>');
+ } else if (Array.isArray(fieldType)) {
+ docsTypes.push('List'); // TODO: use type enum
+ } else {
+ throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');
+ }
+ }
+
+ docs[key] = docsTypes.join(' | ');
+ }
+
+ return {
+ docs: docs,
+ check: createNodeStructureChecker(name, fields)
+ };
+ }
+
+ var structure = {
+ getStructureFromConfig: function(config) {
+ var structure = {};
+
+ if (config.node) {
+ for (var name in config.node) {
+ if (hasOwnProperty$2.call(config.node, name)) {
+ var nodeType = config.node[name];
+
+ if (nodeType.structure) {
+ structure[name] = processStructure(name, nodeType);
+ } else {
+ throw new Error('Missed `structure` field in `' + name + '` node type definition');
+ }
+ }
+ }
+ }
+
+ return structure;
+ }
+ };
+
+ var SyntaxReferenceError$1 = error.SyntaxReferenceError;
+ var SyntaxMatchError$1 = error.SyntaxMatchError;
+
+
+
+
+
+
+ var buildMatchGraph$1 = matchGraph.buildMatchGraph;
+ var matchAsTree$1 = match.matchAsTree;
+
+
+ var getStructureFromConfig = structure.getStructureFromConfig;
+ var cssWideKeywords$1 = buildMatchGraph$1('inherit | initial | unset');
+ var cssWideKeywordsWithExpression = buildMatchGraph$1('inherit | initial | unset | <-ms-legacy-expression>');
+
+ function dumpMapSyntax(map, compact, syntaxAsAst) {
+ var result = {};
+
+ for (var name in map) {
+ if (map[name].syntax) {
+ result[name] = syntaxAsAst
+ ? map[name].syntax
+ : generate_1(map[name].syntax, { compact: compact });
+ }
+ }
+
+ return result;
+ }
+
+ function dumpAtruleMapSyntax(map, compact, syntaxAsAst) {
+ const result = {};
+
+ for (const [name, atrule] of Object.entries(map)) {
+ result[name] = {
+ prelude: atrule.prelude && (
+ syntaxAsAst
+ ? atrule.prelude.syntax
+ : generate_1(atrule.prelude.syntax, { compact })
+ ),
+ descriptors: atrule.descriptors && dumpMapSyntax(atrule.descriptors, compact, syntaxAsAst)
+ };
+ }
+
+ return result;
+ }
+
+ function valueHasVar(tokens) {
+ for (var i = 0; i < tokens.length; i++) {
+ if (tokens[i].value.toLowerCase() === 'var(') {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function buildMatchResult(match, error, iterations) {
+ return {
+ matched: match,
+ iterations: iterations,
+ error: error,
+ getTrace: trace.getTrace,
+ isType: trace.isType,
+ isProperty: trace.isProperty,
+ isKeyword: trace.isKeyword
+ };
+ }
+
+ function matchSyntax(lexer, syntax, value, useCommon) {
+ var tokens = prepareTokens_1(value, lexer.syntax);
+ var result;
+
+ if (valueHasVar(tokens)) {
+ return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));
+ }
+
+ if (useCommon) {
+ result = matchAsTree$1(tokens, lexer.valueCommonSyntax, lexer);
+ }
+
+ if (!useCommon || !result.match) {
+ result = matchAsTree$1(tokens, syntax.match, lexer);
+ if (!result.match) {
+ return buildMatchResult(
+ null,
+ new SyntaxMatchError$1(result.reason, syntax.syntax, value, result),
+ result.iterations
+ );
+ }
+ }
+
+ return buildMatchResult(result.match, null, result.iterations);
+ }
+
+ var Lexer = function(config, syntax, structure) {
+ this.valueCommonSyntax = cssWideKeywords$1;
+ this.syntax = syntax;
+ this.generic = false;
+ this.atrules = {};
+ this.properties = {};
+ this.types = {};
+ this.structure = structure || getStructureFromConfig(config);
+
+ if (config) {
+ if (config.types) {
+ for (var name in config.types) {
+ this.addType_(name, config.types[name]);
+ }
+ }
+
+ if (config.generic) {
+ this.generic = true;
+ for (var name in generic) {
+ this.addType_(name, generic[name]);
+ }
+ }
+
+ if (config.atrules) {
+ for (var name in config.atrules) {
+ this.addAtrule_(name, config.atrules[name]);
+ }
+ }
+
+ if (config.properties) {
+ for (var name in config.properties) {
+ this.addProperty_(name, config.properties[name]);
+ }
+ }
+ }
+ };
+
+ Lexer.prototype = {
+ structure: {},
+ checkStructure: function(ast) {
+ function collectWarning(node, message) {
+ warns.push({
+ node: node,
+ message: message
+ });
+ }
+
+ var structure = this.structure;
+ var warns = [];
+
+ this.syntax.walk(ast, function(node) {
+ if (structure.hasOwnProperty(node.type)) {
+ structure[node.type].check(node, collectWarning);
+ } else {
+ collectWarning(node, 'Unknown node type `' + node.type + '`');
+ }
+ });
+
+ return warns.length ? warns : false;
+ },
+
+ createDescriptor: function(syntax, type, name, parent = null) {
+ var ref = {
+ type: type,
+ name: name
+ };
+ var descriptor = {
+ type: type,
+ name: name,
+ parent: parent,
+ syntax: null,
+ match: null
+ };
+
+ if (typeof syntax === 'function') {
+ descriptor.match = buildMatchGraph$1(syntax, ref);
+ } else {
+ if (typeof syntax === 'string') {
+ // lazy parsing on first access
+ Object.defineProperty(descriptor, 'syntax', {
+ get: function() {
+ Object.defineProperty(descriptor, 'syntax', {
+ value: parse_1(syntax)
+ });
+
+ return descriptor.syntax;
+ }
+ });
+ } else {
+ descriptor.syntax = syntax;
+ }
+
+ // lazy graph build on first access
+ Object.defineProperty(descriptor, 'match', {
+ get: function() {
+ Object.defineProperty(descriptor, 'match', {
+ value: buildMatchGraph$1(descriptor.syntax, ref)
+ });
+
+ return descriptor.match;
+ }
+ });
+ }
+
+ return descriptor;
+ },
+ addAtrule_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.atrules[name] = {
+ type: 'Atrule',
+ name: name,
+ prelude: syntax.prelude ? this.createDescriptor(syntax.prelude, 'AtrulePrelude', name) : null,
+ descriptors: syntax.descriptors
+ ? Object.keys(syntax.descriptors).reduce((res, descName) => {
+ res[descName] = this.createDescriptor(syntax.descriptors[descName], 'AtruleDescriptor', descName, name);
+ return res;
+ }, {})
+ : null
+ };
+ },
+ addProperty_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.properties[name] = this.createDescriptor(syntax, 'Property', name);
+ },
+ addType_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.types[name] = this.createDescriptor(syntax, 'Type', name);
+
+ if (syntax === generic['-ms-legacy-expression']) {
+ this.valueCommonSyntax = cssWideKeywordsWithExpression;
+ }
+ },
+
+ checkAtruleName: function(atruleName) {
+ if (!this.getAtrule(atruleName)) {
+ return new SyntaxReferenceError$1('Unknown at-rule', '@' + atruleName);
+ }
+ },
+ checkAtrulePrelude: function(atruleName, prelude) {
+ let error = this.checkAtruleName(atruleName);
+
+ if (error) {
+ return error;
+ }
+
+ var atrule = this.getAtrule(atruleName);
+
+ if (!atrule.prelude && prelude) {
+ return new SyntaxError('At-rule `@' + atruleName + '` should not contain a prelude');
+ }
+
+ if (atrule.prelude && !prelude) {
+ return new SyntaxError('At-rule `@' + atruleName + '` should contain a prelude');
+ }
+ },
+ checkAtruleDescriptorName: function(atruleName, descriptorName) {
+ let error = this.checkAtruleName(atruleName);
+
+ if (error) {
+ return error;
+ }
+
+ var atrule = this.getAtrule(atruleName);
+ var descriptor = names.keyword(descriptorName);
+
+ if (!atrule.descriptors) {
+ return new SyntaxError('At-rule `@' + atruleName + '` has no known descriptors');
+ }
+
+ if (!atrule.descriptors[descriptor.name] &&
+ !atrule.descriptors[descriptor.basename]) {
+ return new SyntaxReferenceError$1('Unknown at-rule descriptor', descriptorName);
+ }
+ },
+ checkPropertyName: function(propertyName) {
+ var property = names.property(propertyName);
+
+ // don't match syntax for a custom property
+ if (property.custom) {
+ return new Error('Lexer matching doesn\'t applicable for custom properties');
+ }
+
+ if (!this.getProperty(propertyName)) {
+ return new SyntaxReferenceError$1('Unknown property', propertyName);
+ }
+ },
+
+ matchAtrulePrelude: function(atruleName, prelude) {
+ var error = this.checkAtrulePrelude(atruleName, prelude);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ if (!prelude) {
+ return buildMatchResult(null, null);
+ }
+
+ return matchSyntax(this, this.getAtrule(atruleName).prelude, prelude, true);
+ },
+ matchAtruleDescriptor: function(atruleName, descriptorName, value) {
+ var error = this.checkAtruleDescriptorName(atruleName, descriptorName);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ var atrule = this.getAtrule(atruleName);
+ var descriptor = names.keyword(descriptorName);
+
+ return matchSyntax(this, atrule.descriptors[descriptor.name] || atrule.descriptors[descriptor.basename], value, true);
+ },
+ matchDeclaration: function(node) {
+ if (node.type !== 'Declaration') {
+ return buildMatchResult(null, new Error('Not a Declaration node'));
+ }
+
+ return this.matchProperty(node.property, node.value);
+ },
+ matchProperty: function(propertyName, value) {
+ var error = this.checkPropertyName(propertyName);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ return matchSyntax(this, this.getProperty(propertyName), value, true);
+ },
+ matchType: function(typeName, value) {
+ var typeSyntax = this.getType(typeName);
+
+ if (!typeSyntax) {
+ return buildMatchResult(null, new SyntaxReferenceError$1('Unknown type', typeName));
+ }
+
+ return matchSyntax(this, typeSyntax, value, false);
+ },
+ match: function(syntax, value) {
+ if (typeof syntax !== 'string' && (!syntax || !syntax.type)) {
+ return buildMatchResult(null, new SyntaxReferenceError$1('Bad syntax'));
+ }
+
+ if (typeof syntax === 'string' || !syntax.match) {
+ syntax = this.createDescriptor(syntax, 'Type', 'anonymous');
+ }
+
+ return matchSyntax(this, syntax, value, false);
+ },
+
+ findValueFragments: function(propertyName, value, type, name) {
+ return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);
+ },
+ findDeclarationValueFragments: function(declaration, type, name) {
+ return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);
+ },
+ findAllFragments: function(ast, type, name) {
+ var result = [];
+
+ this.syntax.walk(ast, {
+ visit: 'Declaration',
+ enter: function(declaration) {
+ result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));
+ }.bind(this)
+ });
+
+ return result;
+ },
+
+ getAtrule: function(atruleName, fallbackBasename = true) {
+ var atrule = names.keyword(atruleName);
+ var atruleEntry = atrule.vendor && fallbackBasename
+ ? this.atrules[atrule.name] || this.atrules[atrule.basename]
+ : this.atrules[atrule.name];
+
+ return atruleEntry || null;
+ },
+ getAtrulePrelude: function(atruleName, fallbackBasename = true) {
+ const atrule = this.getAtrule(atruleName, fallbackBasename);
+
+ return atrule && atrule.prelude || null;
+ },
+ getAtruleDescriptor: function(atruleName, name) {
+ return this.atrules.hasOwnProperty(atruleName) && this.atrules.declarators
+ ? this.atrules[atruleName].declarators[name] || null
+ : null;
+ },
+ getProperty: function(propertyName, fallbackBasename = true) {
+ var property = names.property(propertyName);
+ var propertyEntry = property.vendor && fallbackBasename
+ ? this.properties[property.name] || this.properties[property.basename]
+ : this.properties[property.name];
+
+ return propertyEntry || null;
+ },
+ getType: function(name) {
+ return this.types.hasOwnProperty(name) ? this.types[name] : null;
+ },
+
+ validate: function() {
+ function validate(syntax, name, broken, descriptor) {
+ if (broken.hasOwnProperty(name)) {
+ return broken[name];
+ }
+
+ broken[name] = false;
+ if (descriptor.syntax !== null) {
+ walk(descriptor.syntax, function(node) {
+ if (node.type !== 'Type' && node.type !== 'Property') {
+ return;
+ }
+
+ var map = node.type === 'Type' ? syntax.types : syntax.properties;
+ var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;
+
+ if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {
+ broken[name] = true;
+ }
+ }, this);
+ }
+ }
+
+ var brokenTypes = {};
+ var brokenProperties = {};
+
+ for (var key in this.types) {
+ validate(this, key, brokenTypes, this.types[key]);
+ }
+
+ for (var key in this.properties) {
+ validate(this, key, brokenProperties, this.properties[key]);
+ }
+
+ brokenTypes = Object.keys(brokenTypes).filter(function(name) {
+ return brokenTypes[name];
+ });
+ brokenProperties = Object.keys(brokenProperties).filter(function(name) {
+ return brokenProperties[name];
+ });
+
+ if (brokenTypes.length || brokenProperties.length) {
+ return {
+ types: brokenTypes,
+ properties: brokenProperties
+ };
+ }
+
+ return null;
+ },
+ dump: function(syntaxAsAst, pretty) {
+ return {
+ generic: this.generic,
+ types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),
+ properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),
+ atrules: dumpAtruleMapSyntax(this.atrules, !pretty, syntaxAsAst)
+ };
+ },
+ toString: function() {
+ return JSON.stringify(this.dump());
+ }
+ };
+
+ var Lexer_1 = Lexer;
+
+ var definitionSyntax = {
+ SyntaxError: _SyntaxError$1,
+ parse: parse_1,
+ generate: generate_1,
+ walk: walk
+ };
+
+ var isBOM$2 = tokenizer.isBOM;
+
+ var N$3 = 10;
+ var F$2 = 12;
+ var R$2 = 13;
+
+ function computeLinesAndColumns(host, source) {
+ var sourceLength = source.length;
+ var lines = adoptBuffer(host.lines, sourceLength); // +1
+ var line = host.startLine;
+ var columns = adoptBuffer(host.columns, sourceLength);
+ var column = host.startColumn;
+ var startOffset = source.length > 0 ? isBOM$2(source.charCodeAt(0)) : 0;
+
+ for (var i = startOffset; i < sourceLength; i++) { // -1
+ var code = source.charCodeAt(i);
+
+ lines[i] = line;
+ columns[i] = column++;
+
+ if (code === N$3 || code === R$2 || code === F$2) {
+ if (code === R$2 && i + 1 < sourceLength && source.charCodeAt(i + 1) === N$3) {
+ i++;
+ lines[i] = line;
+ columns[i] = column;
+ }
+
+ line++;
+ column = 1;
+ }
+ }
+
+ lines[i] = line;
+ columns[i] = column;
+
+ host.lines = lines;
+ host.columns = columns;
+ }
+
+ var OffsetToLocation = function() {
+ this.lines = null;
+ this.columns = null;
+ this.linesAndColumnsComputed = false;
+ };
+
+ OffsetToLocation.prototype = {
+ setSource: function(source, startOffset, startLine, startColumn) {
+ this.source = source;
+ this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;
+ this.startLine = typeof startLine === 'undefined' ? 1 : startLine;
+ this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;
+ this.linesAndColumnsComputed = false;
+ },
+
+ ensureLinesAndColumnsComputed: function() {
+ if (!this.linesAndColumnsComputed) {
+ computeLinesAndColumns(this, this.source);
+ this.linesAndColumnsComputed = true;
+ }
+ },
+ getLocation: function(offset, filename) {
+ this.ensureLinesAndColumnsComputed();
+
+ return {
+ source: filename,
+ offset: this.startOffset + offset,
+ line: this.lines[offset],
+ column: this.columns[offset]
+ };
+ },
+ getLocationRange: function(start, end, filename) {
+ this.ensureLinesAndColumnsComputed();
+
+ return {
+ source: filename,
+ start: {
+ offset: this.startOffset + start,
+ line: this.lines[start],
+ column: this.columns[start]
+ },
+ end: {
+ offset: this.startOffset + end,
+ line: this.lines[end],
+ column: this.columns[end]
+ }
+ };
+ }
+ };
+
+ var OffsetToLocation_1 = OffsetToLocation;
+
+ var TYPE$7 = tokenizer.TYPE;
+ var WHITESPACE$2 = TYPE$7.WhiteSpace;
+ var COMMENT$2 = TYPE$7.Comment;
+
+ var sequence = function readSequence(recognizer) {
+ var children = this.createList();
+ var child = null;
+ var context = {
+ recognizer: recognizer,
+ space: null,
+ ignoreWS: false,
+ ignoreWSAfter: false
+ };
+
+ this.scanner.skipSC();
+
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case COMMENT$2:
+ this.scanner.next();
+ continue;
+
+ case WHITESPACE$2:
+ if (context.ignoreWS) {
+ this.scanner.next();
+ } else {
+ context.space = this.WhiteSpace();
+ }
+ continue;
+ }
+
+ child = recognizer.getNode.call(this, context);
+
+ if (child === undefined) {
+ break;
+ }
+
+ if (context.space !== null) {
+ children.push(context.space);
+ context.space = null;
+ }
+
+ children.push(child);
+
+ if (context.ignoreWSAfter) {
+ context.ignoreWSAfter = false;
+ context.ignoreWS = true;
+ } else {
+ context.ignoreWS = false;
+ }
+ }
+
+ return children;
+ };
+
+ var { findWhiteSpaceStart: findWhiteSpaceStart$1, cmpStr: cmpStr$4 } = utils;
+
+ var noop$2 = function() {};
+
+ var TYPE$8 = _const.TYPE;
+ var NAME$2 = _const.NAME;
+ var WHITESPACE$3 = TYPE$8.WhiteSpace;
+ var COMMENT$3 = TYPE$8.Comment;
+ var IDENT$2 = TYPE$8.Ident;
+ var FUNCTION = TYPE$8.Function;
+ var URL = TYPE$8.Url;
+ var HASH = TYPE$8.Hash;
+ var PERCENTAGE = TYPE$8.Percentage;
+ var NUMBER$2 = TYPE$8.Number;
+ var NUMBERSIGN$1 = 0x0023; // U+0023 NUMBER SIGN (#)
+ var NULL = 0;
+
+ function createParseContext(name) {
+ return function() {
+ return this[name]();
+ };
+ }
+
+ function processConfig(config) {
+ var parserConfig = {
+ context: {},
+ scope: {},
+ atrule: {},
+ pseudo: {}
+ };
+
+ if (config.parseContext) {
+ for (var name in config.parseContext) {
+ switch (typeof config.parseContext[name]) {
+ case 'function':
+ parserConfig.context[name] = config.parseContext[name];
+ break;
+
+ case 'string':
+ parserConfig.context[name] = createParseContext(config.parseContext[name]);
+ break;
+ }
+ }
+ }
+
+ if (config.scope) {
+ for (var name in config.scope) {
+ parserConfig.scope[name] = config.scope[name];
+ }
+ }
+
+ if (config.atrule) {
+ for (var name in config.atrule) {
+ var atrule = config.atrule[name];
+
+ if (atrule.parse) {
+ parserConfig.atrule[name] = atrule.parse;
+ }
+ }
+ }
+
+ if (config.pseudo) {
+ for (var name in config.pseudo) {
+ var pseudo = config.pseudo[name];
+
+ if (pseudo.parse) {
+ parserConfig.pseudo[name] = pseudo.parse;
+ }
+ }
+ }
+
+ if (config.node) {
+ for (var name in config.node) {
+ parserConfig[name] = config.node[name].parse;
+ }
+ }
+
+ return parserConfig;
+ }
+
+ var create = function createParser(config) {
+ var parser = {
+ scanner: new TokenStream_1(),
+ locationMap: new OffsetToLocation_1(),
+
+ filename: '<unknown>',
+ needPositions: false,
+ onParseError: noop$2,
+ onParseErrorThrow: false,
+ parseAtrulePrelude: true,
+ parseRulePrelude: true,
+ parseValue: true,
+ parseCustomProperty: false,
+
+ readSequence: sequence,
+
+ createList: function() {
+ return new List_1();
+ },
+ createSingleNodeList: function(node) {
+ return new List_1().appendData(node);
+ },
+ getFirstListNode: function(list) {
+ return list && list.first();
+ },
+ getLastListNode: function(list) {
+ return list.last();
+ },
+
+ parseWithFallback: function(consumer, fallback) {
+ var startToken = this.scanner.tokenIndex;
+
+ try {
+ return consumer.call(this);
+ } catch (e) {
+ if (this.onParseErrorThrow) {
+ throw e;
+ }
+
+ var fallbackNode = fallback.call(this, startToken);
+
+ this.onParseErrorThrow = true;
+ this.onParseError(e, fallbackNode);
+ this.onParseErrorThrow = false;
+
+ return fallbackNode;
+ }
+ },
+
+ lookupNonWSType: function(offset) {
+ do {
+ var type = this.scanner.lookupType(offset++);
+ if (type !== WHITESPACE$3) {
+ return type;
+ }
+ } while (type !== NULL);
+
+ return NULL;
+ },
+
+ eat: function(tokenType) {
+ if (this.scanner.tokenType !== tokenType) {
+ var offset = this.scanner.tokenStart;
+ var message = NAME$2[tokenType] + ' is expected';
+
+ // tweak message and offset
+ switch (tokenType) {
+ case IDENT$2:
+ // when identifier is expected but there is a function or url
+ if (this.scanner.tokenType === FUNCTION || this.scanner.tokenType === URL) {
+ offset = this.scanner.tokenEnd - 1;
+ message = 'Identifier is expected but function found';
+ } else {
+ message = 'Identifier is expected';
+ }
+ break;
+
+ case HASH:
+ if (this.scanner.isDelim(NUMBERSIGN$1)) {
+ this.scanner.next();
+ offset++;
+ message = 'Name is expected';
+ }
+ break;
+
+ case PERCENTAGE:
+ if (this.scanner.tokenType === NUMBER$2) {
+ offset = this.scanner.tokenEnd;
+ message = 'Percent sign is expected';
+ }
+ break;
+
+ default:
+ // when test type is part of another token show error for current position + 1
+ // e.g. eat(HYPHENMINUS) will fail on "-foo", but pointing on "-" is odd
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === tokenType) {
+ offset = offset + 1;
+ }
+ }
+
+ this.error(message, offset);
+ }
+
+ this.scanner.next();
+ },
+
+ consume: function(tokenType) {
+ var value = this.scanner.getTokenValue();
+
+ this.eat(tokenType);
+
+ return value;
+ },
+ consumeFunctionName: function() {
+ var name = this.scanner.source.substring(this.scanner.tokenStart, this.scanner.tokenEnd - 1);
+
+ this.eat(FUNCTION);
+
+ return name;
+ },
+
+ getLocation: function(start, end) {
+ if (this.needPositions) {
+ return this.locationMap.getLocationRange(
+ start,
+ end,
+ this.filename
+ );
+ }
+
+ return null;
+ },
+ getLocationFromList: function(list) {
+ if (this.needPositions) {
+ var head = this.getFirstListNode(list);
+ var tail = this.getLastListNode(list);
+ return this.locationMap.getLocationRange(
+ head !== null ? head.loc.start.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+ tail !== null ? tail.loc.end.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+ this.filename
+ );
+ }
+
+ return null;
+ },
+
+ error: function(message, offset) {
+ var location = typeof offset !== 'undefined' && offset < this.scanner.source.length
+ ? this.locationMap.getLocation(offset)
+ : this.scanner.eof
+ ? this.locationMap.getLocation(findWhiteSpaceStart$1(this.scanner.source, this.scanner.source.length - 1))
+ : this.locationMap.getLocation(this.scanner.tokenStart);
+
+ throw new _SyntaxError(
+ message || 'Unexpected input',
+ this.scanner.source,
+ location.offset,
+ location.line,
+ location.column
+ );
+ }
+ };
+
+ config = processConfig(config || {});
+ for (var key in config) {
+ parser[key] = config[key];
+ }
+
+ return function(source, options) {
+ options = options || {};
+
+ var context = options.context || 'default';
+ var onComment = options.onComment;
+ var ast;
+
+ tokenizer(source, parser.scanner);
+ parser.locationMap.setSource(
+ source,
+ options.offset,
+ options.line,
+ options.column
+ );
+
+ parser.filename = options.filename || '<unknown>';
+ parser.needPositions = Boolean(options.positions);
+ parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop$2;
+ parser.onParseErrorThrow = false;
+ parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;
+ parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;
+ parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;
+ parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;
+
+ if (!parser.context.hasOwnProperty(context)) {
+ throw new Error('Unknown context `' + context + '`');
+ }
+
+ if (typeof onComment === 'function') {
+ parser.scanner.forEachToken((type, start, end) => {
+ if (type === COMMENT$3) {
+ const loc = parser.getLocation(start, end);
+ const value = cmpStr$4(source, end - 2, end, '*/')
+ ? source.slice(start + 2, end - 2)
+ : source.slice(start + 2, end);
+
+ onComment(value, loc);
+ }
+ });
+ }
+
+ ast = parser.context[context].call(parser, options);
+
+ if (!parser.scanner.eof) {
+ parser.error();
+ }
+
+ return ast;
+ };
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ var encode = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+
+ /**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+ var decode = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+ };
+
+ var base64 = {
+ encode: encode,
+ decode: decode
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ var encode$1 = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ var decode$1 = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+ };
+
+ var base64Vlq = {
+ encode: encode$1,
+ decode: decode$1
+ };
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ var util = createCommonjsModule(function (module, exports) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+ }
+ exports.relative = relative;
+
+ var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+ }());
+
+ function identity (s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto ? identity : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+ });
+ var util_1 = util.getArg;
+ var util_2 = util.urlParse;
+ var util_3 = util.urlGenerate;
+ var util_4 = util.normalize;
+ var util_5 = util.join;
+ var util_6 = util.isAbsolute;
+ var util_7 = util.relative;
+ var util_8 = util.toSetString;
+ var util_9 = util.fromSetString;
+ var util_10 = util.compareByOriginalPositions;
+ var util_11 = util.compareByGeneratedPositionsDeflated;
+ var util_12 = util.compareByGeneratedPositionsInflated;
+ var util_13 = util.parseSourceMapInput;
+ var util_14 = util.computeSourceURL;
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+ var has = Object.prototype.hasOwnProperty;
+ var hasNativeMap = typeof Map !== "undefined";
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ ArraySet.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ var ArraySet_1 = ArraySet;
+
+ var arraySet = {
+ ArraySet: ArraySet_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ var MappingList_1 = MappingList;
+
+ var mappingList = {
+ MappingList: MappingList_1
+ };
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+
+
+ var ArraySet$1 = arraySet.ArraySet;
+ var MappingList$1 = mappingList.MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet$1();
+ this._names = new ArraySet$1();
+ this._mappings = new MappingList$1();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet$1();
+ var newNames = new ArraySet$1();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = '';
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64Vlq.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64Vlq.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64Vlq.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64Vlq.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64Vlq.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+ var SourceMapGenerator_1 = SourceMapGenerator;
+
+ var sourceMapGenerator = {
+ SourceMapGenerator: SourceMapGenerator_1
+ };
+
+ var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator;
+ var trackNodes = {
+ Atrule: true,
+ Selector: true,
+ Declaration: true
+ };
+
+ var sourceMap = function generateSourceMap(handlers) {
+ var map = new SourceMapGenerator$1();
+ var line = 1;
+ var column = 0;
+ var generated = {
+ line: 1,
+ column: 0
+ };
+ var original = {
+ line: 0, // should be zero to add first mapping
+ column: 0
+ };
+ var sourceMappingActive = false;
+ var activatedGenerated = {
+ line: 1,
+ column: 0
+ };
+ var activatedMapping = {
+ generated: activatedGenerated
+ };
+
+ var handlersNode = handlers.node;
+ handlers.node = function(node) {
+ if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) {
+ var nodeLine = node.loc.start.line;
+ var nodeColumn = node.loc.start.column - 1;
+
+ if (original.line !== nodeLine ||
+ original.column !== nodeColumn) {
+ original.line = nodeLine;
+ original.column = nodeColumn;
+
+ generated.line = line;
+ generated.column = column;
+
+ if (sourceMappingActive) {
+ sourceMappingActive = false;
+ if (generated.line !== activatedGenerated.line ||
+ generated.column !== activatedGenerated.column) {
+ map.addMapping(activatedMapping);
+ }
+ }
+
+ sourceMappingActive = true;
+ map.addMapping({
+ source: node.loc.source,
+ original: original,
+ generated: generated
+ });
+ }
+ }
+
+ handlersNode.call(this, node);
+
+ if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {
+ activatedGenerated.line = line;
+ activatedGenerated.column = column;
+ }
+ };
+
+ var handlersChunk = handlers.chunk;
+ handlers.chunk = function(chunk) {
+ for (var i = 0; i < chunk.length; i++) {
+ if (chunk.charCodeAt(i) === 10) { // \n
+ line++;
+ column = 0;
+ } else {
+ column++;
+ }
+ }
+
+ handlersChunk(chunk);
+ };
+
+ var handlersResult = handlers.result;
+ handlers.result = function() {
+ if (sourceMappingActive) {
+ map.addMapping(activatedMapping);
+ }
+
+ return {
+ css: handlersResult(),
+ map: map
+ };
+ };
+
+ return handlers;
+ };
+
+ var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
+
+ function processChildren(node, delimeter) {
+ var list = node.children;
+ var prev = null;
+
+ if (typeof delimeter !== 'function') {
+ list.forEach(this.node, this);
+ } else {
+ list.forEach(function(node) {
+ if (prev !== null) {
+ delimeter.call(this, prev);
+ }
+
+ this.node(node);
+ prev = node;
+ }, this);
+ }
+ }
+
+ var create$1 = function createGenerator(config) {
+ function processNode(node) {
+ if (hasOwnProperty$3.call(types, node.type)) {
+ types[node.type].call(this, node);
+ } else {
+ throw new Error('Unknown node type: ' + node.type);
+ }
+ }
+
+ var types = {};
+
+ if (config.node) {
+ for (var name in config.node) {
+ types[name] = config.node[name].generate;
+ }
+ }
+
+ return function(node, options) {
+ var buffer = '';
+ var handlers = {
+ children: processChildren,
+ node: processNode,
+ chunk: function(chunk) {
+ buffer += chunk;
+ },
+ result: function() {
+ return buffer;
+ }
+ };
+
+ if (options) {
+ if (typeof options.decorator === 'function') {
+ handlers = options.decorator(handlers);
+ }
+
+ if (options.sourceMap) {
+ handlers = sourceMap(handlers);
+ }
+ }
+
+ handlers.node(node);
+
+ return handlers.result();
+ };
+ };
+
+ var create$2 = function createConvertors(walk) {
+ return {
+ fromPlainObject: function(ast) {
+ walk(ast, {
+ enter: function(node) {
+ if (node.children && node.children instanceof List_1 === false) {
+ node.children = new List_1().fromArray(node.children);
+ }
+ }
+ });
+
+ return ast;
+ },
+ toPlainObject: function(ast) {
+ walk(ast, {
+ leave: function(node) {
+ if (node.children && node.children instanceof List_1) {
+ node.children = node.children.toArray();
+ }
+ }
+ });
+
+ return ast;
+ }
+ };
+ };
+
+ var hasOwnProperty$4 = Object.prototype.hasOwnProperty;
+ var noop$3 = function() {};
+
+ function ensureFunction$1(value) {
+ return typeof value === 'function' ? value : noop$3;
+ }
+
+ function invokeForType(fn, type) {
+ return function(node, item, list) {
+ if (node.type === type) {
+ fn.call(this, node, item, list);
+ }
+ };
+ }
+
+ function getWalkersFromStructure(name, nodeType) {
+ var structure = nodeType.structure;
+ var walkers = [];
+
+ for (var key in structure) {
+ if (hasOwnProperty$4.call(structure, key) === false) {
+ continue;
+ }
+
+ var fieldTypes = structure[key];
+ var walker = {
+ name: key,
+ type: false,
+ nullable: false
+ };
+
+ if (!Array.isArray(structure[key])) {
+ fieldTypes = [structure[key]];
+ }
+
+ for (var i = 0; i < fieldTypes.length; i++) {
+ var fieldType = fieldTypes[i];
+ if (fieldType === null) {
+ walker.nullable = true;
+ } else if (typeof fieldType === 'string') {
+ walker.type = 'node';
+ } else if (Array.isArray(fieldType)) {
+ walker.type = 'list';
+ }
+ }
+
+ if (walker.type) {
+ walkers.push(walker);
+ }
+ }
+
+ if (walkers.length) {
+ return {
+ context: nodeType.walkContext,
+ fields: walkers
+ };
+ }
+
+ return null;
+ }
+
+ function getTypesFromConfig(config) {
+ var types = {};
+
+ for (var name in config.node) {
+ if (hasOwnProperty$4.call(config.node, name)) {
+ var nodeType = config.node[name];
+
+ if (!nodeType.structure) {
+ throw new Error('Missed `structure` field in `' + name + '` node type definition');
+ }
+
+ types[name] = getWalkersFromStructure(name, nodeType);
+ }
+ }
+
+ return types;
+ }
+
+ function createTypeIterator(config, reverse) {
+ var fields = config.fields.slice();
+ var contextName = config.context;
+ var useContext = typeof contextName === 'string';
+
+ if (reverse) {
+ fields.reverse();
+ }
+
+ return function(node, context, walk, walkReducer) {
+ var prevContextValue;
+
+ if (useContext) {
+ prevContextValue = context[contextName];
+ context[contextName] = node;
+ }
+
+ for (var i = 0; i < fields.length; i++) {
+ var field = fields[i];
+ var ref = node[field.name];
+
+ if (!field.nullable || ref) {
+ if (field.type === 'list') {
+ var breakWalk = reverse
+ ? ref.reduceRight(walkReducer, false)
+ : ref.reduce(walkReducer, false);
+
+ if (breakWalk) {
+ return true;
+ }
+ } else if (walk(ref)) {
+ return true;
+ }
+ }
+ }
+
+ if (useContext) {
+ context[contextName] = prevContextValue;
+ }
+ };
+ }
+
+ function createFastTraveralMap(iterators) {
+ return {
+ Atrule: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block
+ },
+ Rule: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block
+ },
+ Declaration: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block,
+ DeclarationList: iterators.DeclarationList
+ }
+ };
+ }
+
+ var create$3 = function createWalker(config) {
+ var types = getTypesFromConfig(config);
+ var iteratorsNatural = {};
+ var iteratorsReverse = {};
+ var breakWalk = Symbol('break-walk');
+ var skipNode = Symbol('skip-node');
+
+ for (var name in types) {
+ if (hasOwnProperty$4.call(types, name) && types[name] !== null) {
+ iteratorsNatural[name] = createTypeIterator(types[name], false);
+ iteratorsReverse[name] = createTypeIterator(types[name], true);
+ }
+ }
+
+ var fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);
+ var fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);
+
+ var walk = function(root, options) {
+ function walkNode(node, item, list) {
+ var enterRet = enter.call(context, node, item, list);
+
+ if (enterRet === breakWalk) {
+ debugger;
+ return true;
+ }
+
+ if (enterRet === skipNode) {
+ return false;
+ }
+
+ if (iterators.hasOwnProperty(node.type)) {
+ if (iterators[node.type](node, context, walkNode, walkReducer)) {
+ return true;
+ }
+ }
+
+ if (leave.call(context, node, item, list) === breakWalk) {
+ return true;
+ }
+
+ return false;
+ }
+
+ var walkReducer = (ret, data, item, list) => ret || walkNode(data, item, list);
+ var enter = noop$3;
+ var leave = noop$3;
+ var iterators = iteratorsNatural;
+ var context = {
+ break: breakWalk,
+ skip: skipNode,
+
+ root: root,
+ stylesheet: null,
+ atrule: null,
+ atrulePrelude: null,
+ rule: null,
+ selector: null,
+ block: null,
+ declaration: null,
+ function: null
+ };
+
+ if (typeof options === 'function') {
+ enter = options;
+ } else if (options) {
+ enter = ensureFunction$1(options.enter);
+ leave = ensureFunction$1(options.leave);
+
+ if (options.reverse) {
+ iterators = iteratorsReverse;
+ }
+
+ if (options.visit) {
+ if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {
+ iterators = options.reverse
+ ? fastTraversalIteratorsReverse[options.visit]
+ : fastTraversalIteratorsNatural[options.visit];
+ } else if (!types.hasOwnProperty(options.visit)) {
+ throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).join(', ') + ')');
+ }
+
+ enter = invokeForType(enter, options.visit);
+ leave = invokeForType(leave, options.visit);
+ }
+ }
+
+ if (enter === noop$3 && leave === noop$3) {
+ throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+ }
+
+ walkNode(root);
+ };
+
+ walk.break = breakWalk;
+ walk.skip = skipNode;
+
+ walk.find = function(ast, fn) {
+ var found = null;
+
+ walk(ast, function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found = node;
+ return breakWalk;
+ }
+ });
+
+ return found;
+ };
+
+ walk.findLast = function(ast, fn) {
+ var found = null;
+
+ walk(ast, {
+ reverse: true,
+ enter: function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found = node;
+ return breakWalk;
+ }
+ }
+ });
+
+ return found;
+ };
+
+ walk.findAll = function(ast, fn) {
+ var found = [];
+
+ walk(ast, function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found.push(node);
+ }
+ });
+
+ return found;
+ };
+
+ return walk;
+ };
+
+ var clone = function clone(node) {
+ var result = {};
+
+ for (var key in node) {
+ var value = node[key];
+
+ if (value) {
+ if (Array.isArray(value) || value instanceof List_1) {
+ value = value.map(clone);
+ } else if (value.constructor === Object) {
+ value = clone(value);
+ }
+ }
+
+ result[key] = value;
+ }
+
+ return result;
+ };
+
+ const hasOwnProperty$5 = Object.prototype.hasOwnProperty;
+ const shape = {
+ generic: true,
+ types: appendOrAssign,
+ atrules: {
+ prelude: appendOrAssignOrNull,
+ descriptors: appendOrAssignOrNull
+ },
+ properties: appendOrAssign,
+ parseContext: assign,
+ scope: deepAssign,
+ atrule: ['parse'],
+ pseudo: ['parse'],
+ node: ['name', 'structure', 'parse', 'generate', 'walkContext']
+ };
+
+ function isObject(value) {
+ return value && value.constructor === Object;
+ }
+
+ function copy(value) {
+ return isObject(value)
+ ? Object.assign({}, value)
+ : value;
+ }
+
+ function assign(dest, src) {
+ return Object.assign(dest, src);
+ }
+
+ function deepAssign(dest, src) {
+ for (const key in src) {
+ if (hasOwnProperty$5.call(src, key)) {
+ if (isObject(dest[key])) {
+ deepAssign(dest[key], copy(src[key]));
+ } else {
+ dest[key] = copy(src[key]);
+ }
+ }
+ }
+
+ return dest;
+ }
+
+ function append(a, b) {
+ if (typeof b === 'string' && /^\s*\|/.test(b)) {
+ return typeof a === 'string'
+ ? a + b
+ : b.replace(/^\s*\|\s*/, '');
+ }
+
+ return b || null;
+ }
+
+ function appendOrAssign(a, b) {
+ if (typeof b === 'string') {
+ return append(a, b);
+ }
+
+ const result = Object.assign({}, a);
+ for (let key in b) {
+ if (hasOwnProperty$5.call(b, key)) {
+ result[key] = append(hasOwnProperty$5.call(a, key) ? a[key] : undefined, b[key]);
+ }
+ }
+
+ return result;
+ }
+
+ function appendOrAssignOrNull(a, b) {
+ const result = appendOrAssign(a, b);
+
+ return !isObject(result) || Object.keys(result).length
+ ? result
+ : null;
+ }
+
+ function mix(dest, src, shape) {
+ for (const key in shape) {
+ if (hasOwnProperty$5.call(shape, key) === false) {
+ continue;
+ }
+
+ if (shape[key] === true) {
+ if (key in src) {
+ if (hasOwnProperty$5.call(src, key)) {
+ dest[key] = copy(src[key]);
+ }
+ }
+ } else if (shape[key]) {
+ if (typeof shape[key] === 'function') {
+ const fn = shape[key];
+ dest[key] = fn({}, dest[key]);
+ dest[key] = fn(dest[key] || {}, src[key]);
+ } else if (isObject(shape[key])) {
+ const result = {};
+
+ for (let name in dest[key]) {
+ result[name] = mix({}, dest[key][name], shape[key]);
+ }
+
+ for (let name in src[key]) {
+ result[name] = mix(result[name] || {}, src[key][name], shape[key]);
+ }
+
+ dest[key] = result;
+ } else if (Array.isArray(shape[key])) {
+ const res = {};
+ const innerShape = shape[key].reduce(function(s, k) {
+ s[k] = true;
+ return s;
+ }, {});
+
+ for (const [name, value] of Object.entries(dest[key] || {})) {
+ res[name] = {};
+ if (value) {
+ mix(res[name], value, innerShape);
+ }
+ }
+
+ for (const name in src[key]) {
+ if (hasOwnProperty$5.call(src[key], name)) {
+ if (!res[name]) {
+ res[name] = {};
+ }
+
+ if (src[key] && src[key][name]) {
+ mix(res[name], src[key][name], innerShape);
+ }
+ }
+ }
+
+ dest[key] = res;
+ }
+ }
+ }
+ return dest;
+ }
+
+ var mix_1 = (dest, src) => mix(dest, src, shape);
+
+ function createSyntax(config) {
+ var parse = create(config);
+ var walk = create$3(config);
+ var generate = create$1(config);
+ var convert = create$2(walk);
+
+ var syntax = {
+ List: List_1,
+ SyntaxError: _SyntaxError,
+ TokenStream: TokenStream_1,
+ Lexer: Lexer_1,
+
+ vendorPrefix: names.vendorPrefix,
+ keyword: names.keyword,
+ property: names.property,
+ isCustomProperty: names.isCustomProperty,
+
+ definitionSyntax: definitionSyntax,
+ lexer: null,
+ createLexer: function(config) {
+ return new Lexer_1(config, syntax, syntax.lexer.structure);
+ },
+
+ tokenize: tokenizer,
+ parse: parse,
+ walk: walk,
+ generate: generate,
+
+ find: walk.find,
+ findLast: walk.findLast,
+ findAll: walk.findAll,
+
+ clone: clone,
+ fromPlainObject: convert.fromPlainObject,
+ toPlainObject: convert.toPlainObject,
+
+ createSyntax: function(config) {
+ return createSyntax(mix_1({}, config));
+ },
+ fork: function(extension) {
+ var base = mix_1({}, config); // copy of config
+ return createSyntax(
+ typeof extension === 'function'
+ ? extension(base, Object.assign)
+ : mix_1(base, extension)
+ );
+ }
+ };
+
+ syntax.lexer = new Lexer_1({
+ generic: true,
+ types: config.types,
+ atrules: config.atrules,
+ properties: config.properties,
+ node: config.node
+ }, syntax);
+
+ return syntax;
+ }
+ var create_1 = function(config) {
+ return createSyntax(mix_1({}, config));
+ };
+
+ var create$4 = {
+ create: create_1
+ };
+
+ var data = {
+ "generic": true,
+ "types": {
+ "absolute-size": "xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large",
+ "alpha-value": "<number>|<percentage>",
+ "angle-percentage": "<angle>|<percentage>",
+ "angular-color-hint": "<angle-percentage>",
+ "angular-color-stop": "<color>&&<color-stop-angle>?",
+ "angular-color-stop-list": "[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>",
+ "animateable-feature": "scroll-position|contents|<custom-ident>",
+ "attachment": "scroll|fixed|local",
+ "attr()": "attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )",
+ "attr-matcher": "['~'|'|'|'^'|'$'|'*']? '='",
+ "attr-modifier": "i|s",
+ "attribute-selector": "'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'",
+ "auto-repeat": "repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )",
+ "auto-track-list": "[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?",
+ "baseline-position": "[first|last]? baseline",
+ "basic-shape": "<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>",
+ "bg-image": "none|<image>",
+ "bg-layer": "<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>",
+ "bg-position": "[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]",
+ "bg-size": "[<length-percentage>|auto]{1,2}|cover|contain",
+ "blur()": "blur( <length> )",
+ "blend-mode": "normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",
+ "box": "border-box|padding-box|content-box",
+ "brightness()": "brightness( <number-percentage> )",
+ "calc()": "calc( <calc-sum> )",
+ "calc-sum": "<calc-product> [['+'|'-'] <calc-product>]*",
+ "calc-product": "<calc-value> ['*' <calc-value>|'/' <number>]*",
+ "calc-value": "<number>|<dimension>|<percentage>|( <calc-sum> )",
+ "cf-final-image": "<image>|<color>",
+ "cf-mixing-image": "<percentage>?&&<image>",
+ "circle()": "circle( [<shape-radius>]? [at <position>]? )",
+ "clamp()": "clamp( <calc-sum>#{3} )",
+ "class-selector": "'.' <ident-token>",
+ "clip-source": "<url>",
+ "color": "<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>",
+ "color-stop": "<color-stop-length>|<color-stop-angle>",
+ "color-stop-angle": "<angle-percentage>{1,2}",
+ "color-stop-length": "<length-percentage>{1,2}",
+ "color-stop-list": "[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",
+ "combinator": "'>'|'+'|'~'|['||']",
+ "common-lig-values": "[common-ligatures|no-common-ligatures]",
+ "compat-auto": "searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button",
+ "composite-style": "clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor",
+ "compositing-operator": "add|subtract|intersect|exclude",
+ "compound-selector": "[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!",
+ "compound-selector-list": "<compound-selector>#",
+ "complex-selector": "<compound-selector> [<combinator>? <compound-selector>]*",
+ "complex-selector-list": "<complex-selector>#",
+ "conic-gradient()": "conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )",
+ "contextual-alt-values": "[contextual|no-contextual]",
+ "content-distribution": "space-between|space-around|space-evenly|stretch",
+ "content-list": "[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+",
+ "content-position": "center|start|end|flex-start|flex-end",
+ "content-replacement": "<image>",
+ "contrast()": "contrast( [<number-percentage>] )",
+ "counter()": "counter( <custom-ident> , <counter-style>? )",
+ "counter-style": "<counter-style-name>|symbols( )",
+ "counter-style-name": "<custom-ident>",
+ "counters()": "counters( <custom-ident> , <string> , <counter-style>? )",
+ "cross-fade()": "cross-fade( <cf-mixing-image> , <cf-final-image>? )",
+ "cubic-bezier-timing-function": "ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )",
+ "deprecated-system-color": "ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText",
+ "discretionary-lig-values": "[discretionary-ligatures|no-discretionary-ligatures]",
+ "display-box": "contents|none",
+ "display-inside": "flow|flow-root|table|flex|grid|ruby",
+ "display-internal": "table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container",
+ "display-legacy": "inline-block|inline-list-item|inline-table|inline-flex|inline-grid",
+ "display-listitem": "<display-outside>?&&[flow|flow-root]?&&list-item",
+ "display-outside": "block|inline|run-in",
+ "drop-shadow()": "drop-shadow( <length>{2,3} <color>? )",
+ "east-asian-variant-values": "[jis78|jis83|jis90|jis04|simplified|traditional]",
+ "east-asian-width-values": "[full-width|proportional-width]",
+ "element()": "element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )",
+ "ellipse()": "ellipse( [<shape-radius>{2}]? [at <position>]? )",
+ "ending-shape": "circle|ellipse",
+ "env()": "env( <custom-ident> , <declaration-value>? )",
+ "explicit-track-list": "[<line-names>? <track-size>]+ <line-names>?",
+ "family-name": "<string>|<custom-ident>+",
+ "feature-tag-value": "<string> [<integer>|on|off]?",
+ "feature-type": "@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation",
+ "feature-value-block": "<feature-type> '{' <feature-value-declaration-list> '}'",
+ "feature-value-block-list": "<feature-value-block>+",
+ "feature-value-declaration": "<custom-ident> : <integer>+ ;",
+ "feature-value-declaration-list": "<feature-value-declaration>",
+ "feature-value-name": "<custom-ident>",
+ "fill-rule": "nonzero|evenodd",
+ "filter-function": "<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>",
+ "filter-function-list": "[<filter-function>|<url>]+",
+ "final-bg-layer": "<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>",
+ "fit-content()": "fit-content( [<length>|<percentage>] )",
+ "fixed-breadth": "<length-percentage>",
+ "fixed-repeat": "repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )",
+ "fixed-size": "<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )",
+ "font-stretch-absolute": "normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>",
+ "font-variant-css21": "[normal|small-caps]",
+ "font-weight-absolute": "normal|bold|<number [1,1000]>",
+ "frequency-percentage": "<frequency>|<percentage>",
+ "general-enclosed": "[<function-token> <any-value> )]|( <ident> <any-value> )",
+ "generic-family": "serif|sans-serif|cursive|fantasy|monospace|-apple-system",
+ "generic-name": "serif|sans-serif|cursive|fantasy|monospace",
+ "geometry-box": "<shape-box>|fill-box|stroke-box|view-box",
+ "gradient": "<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>",
+ "grayscale()": "grayscale( <number-percentage> )",
+ "grid-line": "auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]",
+ "historical-lig-values": "[historical-ligatures|no-historical-ligatures]",
+ "hsl()": "hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+ "hsla()": "hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",
+ "hue": "<number>|<angle>",
+ "hue-rotate()": "hue-rotate( <angle> )",
+ "image": "<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>",
+ "image()": "image( <image-tags>? [<image-src>? , <color>?]! )",
+ "image-set()": "image-set( <image-set-option># )",
+ "image-set-option": "[<image>|<string>] <resolution>",
+ "image-src": "<url>|<string>",
+ "image-tags": "ltr|rtl",
+ "inflexible-breadth": "<length>|<percentage>|min-content|max-content|auto",
+ "inset()": "inset( <length-percentage>{1,4} [round <'border-radius'>]? )",
+ "invert()": "invert( <number-percentage> )",
+ "keyframes-name": "<custom-ident>|<string>",
+ "keyframe-block": "<keyframe-selector># { <declaration-list> }",
+ "keyframe-block-list": "<keyframe-block>+",
+ "keyframe-selector": "from|to|<percentage>",
+ "leader()": "leader( <leader-type> )",
+ "leader-type": "dotted|solid|space|<string>",
+ "length-percentage": "<length>|<percentage>",
+ "line-names": "'[' <custom-ident>* ']'",
+ "line-name-list": "[<line-names>|<name-repeat>]+",
+ "line-style": "none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset",
+ "line-width": "<length>|thin|medium|thick",
+ "linear-color-hint": "<length-percentage>",
+ "linear-color-stop": "<color> <color-stop-length>?",
+ "linear-gradient()": "linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )",
+ "mask-layer": "<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>",
+ "mask-position": "[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?",
+ "mask-reference": "none|<image>|<mask-source>",
+ "mask-source": "<url>",
+ "masking-mode": "alpha|luminance|match-source",
+ "matrix()": "matrix( <number>#{6} )",
+ "matrix3d()": "matrix3d( <number>#{16} )",
+ "max()": "max( <calc-sum># )",
+ "media-and": "<media-in-parens> [and <media-in-parens>]+",
+ "media-condition": "<media-not>|<media-and>|<media-or>|<media-in-parens>",
+ "media-condition-without-or": "<media-not>|<media-and>|<media-in-parens>",
+ "media-feature": "( [<mf-plain>|<mf-boolean>|<mf-range>] )",
+ "media-in-parens": "( <media-condition> )|<media-feature>|<general-enclosed>",
+ "media-not": "not <media-in-parens>",
+ "media-or": "<media-in-parens> [or <media-in-parens>]+",
+ "media-query": "<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?",
+ "media-query-list": "<media-query>#",
+ "media-type": "<ident>",
+ "mf-boolean": "<mf-name>",
+ "mf-name": "<ident>",
+ "mf-plain": "<mf-name> : <mf-value>",
+ "mf-range": "<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>",
+ "mf-value": "<number>|<dimension>|<ident>|<ratio>",
+ "min()": "min( <calc-sum># )",
+ "minmax()": "minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )",
+ "named-color": "transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>",
+ "namespace-prefix": "<ident>",
+ "ns-prefix": "[<ident-token>|'*']? '|'",
+ "number-percentage": "<number>|<percentage>",
+ "numeric-figure-values": "[lining-nums|oldstyle-nums]",
+ "numeric-fraction-values": "[diagonal-fractions|stacked-fractions]",
+ "numeric-spacing-values": "[proportional-nums|tabular-nums]",
+ "nth": "<an-plus-b>|even|odd",
+ "opacity()": "opacity( [<number-percentage>] )",
+ "overflow-position": "unsafe|safe",
+ "outline-radius": "<length>|<percentage>",
+ "page-body": "<declaration>? [; <page-body>]?|<page-margin-box> <page-body>",
+ "page-margin-box": "<page-margin-box-type> '{' <declaration-list> '}'",
+ "page-margin-box-type": "@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom",
+ "page-selector-list": "[<page-selector>#]?",
+ "page-selector": "<pseudo-page>+|<ident> <pseudo-page>*",
+ "path()": "path( [<fill-rule> ,]? <string> )",
+ "paint()": "paint( <ident> , <declaration-value>? )",
+ "perspective()": "perspective( <length> )",
+ "polygon()": "polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",
+ "position": "[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]",
+ "pseudo-class-selector": "':' <ident-token>|':' <function-token> <any-value> ')'",
+ "pseudo-element-selector": "':' <pseudo-class-selector>",
+ "pseudo-page": ": [left|right|first|blank]",
+ "quote": "open-quote|close-quote|no-open-quote|no-close-quote",
+ "radial-gradient()": "radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )",
+ "relative-selector": "<combinator>? <complex-selector>",
+ "relative-selector-list": "<relative-selector>#",
+ "relative-size": "larger|smaller",
+ "repeat-style": "repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}",
+ "repeating-linear-gradient()": "repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )",
+ "repeating-radial-gradient()": "repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )",
+ "rgb()": "rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )",
+ "rgba()": "rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )",
+ "rotate()": "rotate( [<angle>|<zero>] )",
+ "rotate3d()": "rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )",
+ "rotateX()": "rotateX( [<angle>|<zero>] )",
+ "rotateY()": "rotateY( [<angle>|<zero>] )",
+ "rotateZ()": "rotateZ( [<angle>|<zero>] )",
+ "saturate()": "saturate( <number-percentage> )",
+ "scale()": "scale( <number> , <number>? )",
+ "scale3d()": "scale3d( <number> , <number> , <number> )",
+ "scaleX()": "scaleX( <number> )",
+ "scaleY()": "scaleY( <number> )",
+ "scaleZ()": "scaleZ( <number> )",
+ "self-position": "center|start|end|self-start|self-end|flex-start|flex-end",
+ "shape-radius": "<length-percentage>|closest-side|farthest-side",
+ "skew()": "skew( [<angle>|<zero>] , [<angle>|<zero>]? )",
+ "skewX()": "skewX( [<angle>|<zero>] )",
+ "skewY()": "skewY( [<angle>|<zero>] )",
+ "sepia()": "sepia( <number-percentage> )",
+ "shadow": "inset?&&<length>{2,4}&&<color>?",
+ "shadow-t": "[<length>{2,3}&&<color>?]",
+ "shape": "rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )",
+ "shape-box": "<box>|margin-box",
+ "side-or-corner": "[left|right]||[top|bottom]",
+ "single-animation": "<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]",
+ "single-animation-direction": "normal|reverse|alternate|alternate-reverse",
+ "single-animation-fill-mode": "none|forwards|backwards|both",
+ "single-animation-iteration-count": "infinite|<number>",
+ "single-animation-play-state": "running|paused",
+ "single-transition": "[none|<single-transition-property>]||<time>||<timing-function>||<time>",
+ "single-transition-property": "all|<custom-ident>",
+ "size": "closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}",
+ "step-position": "jump-start|jump-end|jump-none|jump-both|start|end",
+ "step-timing-function": "step-start|step-end|steps( <integer> [, <step-position>]? )",
+ "subclass-selector": "<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>",
+ "supports-condition": "not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*",
+ "supports-in-parens": "( <supports-condition> )|<supports-feature>|<general-enclosed>",
+ "supports-feature": "<supports-decl>|<supports-selector-fn>",
+ "supports-decl": "( <declaration> )",
+ "supports-selector-fn": "selector( <complex-selector> )",
+ "symbol": "<string>|<image>|<custom-ident>",
+ "target": "<target-counter()>|<target-counters()>|<target-text()>",
+ "target-counter()": "target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )",
+ "target-counters()": "target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )",
+ "target-text()": "target-text( [<string>|<url>] , [content|before|after|first-letter]? )",
+ "time-percentage": "<time>|<percentage>",
+ "timing-function": "linear|<cubic-bezier-timing-function>|<step-timing-function>",
+ "track-breadth": "<length-percentage>|<flex>|min-content|max-content|auto",
+ "track-list": "[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?",
+ "track-repeat": "repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )",
+ "track-size": "<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )",
+ "transform-function": "<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>",
+ "transform-list": "<transform-function>+",
+ "translate()": "translate( <length-percentage> , <length-percentage>? )",
+ "translate3d()": "translate3d( <length-percentage> , <length-percentage> , <length> )",
+ "translateX()": "translateX( <length-percentage> )",
+ "translateY()": "translateY( <length-percentage> )",
+ "translateZ()": "translateZ( <length> )",
+ "type-or-unit": "string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%",
+ "type-selector": "<wq-name>|<ns-prefix>? '*'",
+ "var()": "var( <custom-property-name> , <declaration-value>? )",
+ "viewport-length": "auto|<length-percentage>",
+ "wq-name": "<ns-prefix>? <ident-token>",
+ "-legacy-gradient": "<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>",
+ "-legacy-linear-gradient": "-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )",
+ "-legacy-repeating-linear-gradient": "-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )",
+ "-legacy-linear-gradient-arguments": "[<angle>|<side-or-corner>]? , <color-stop-list>",
+ "-legacy-radial-gradient": "-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )",
+ "-legacy-repeating-radial-gradient": "-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )",
+ "-legacy-radial-gradient-arguments": "[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>",
+ "-legacy-radial-gradient-size": "closest-side|closest-corner|farthest-side|farthest-corner|contain|cover",
+ "-legacy-radial-gradient-shape": "circle|ellipse",
+ "-non-standard-font": "-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body",
+ "-non-standard-color": "-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text",
+ "-non-standard-image-rendering": "optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast",
+ "-non-standard-overflow": "-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable",
+ "-non-standard-width": "fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content",
+ "-webkit-gradient()": "-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )",
+ "-webkit-gradient-color-stop": "from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )",
+ "-webkit-gradient-point": "[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]",
+ "-webkit-gradient-radius": "<length>|<percentage>",
+ "-webkit-gradient-type": "linear|radial",
+ "-webkit-mask-box-repeat": "repeat|stretch|round",
+ "-webkit-mask-clip-style": "border|border-box|padding|padding-box|content|content-box|text",
+ "-ms-filter-function-list": "<-ms-filter-function>+",
+ "-ms-filter-function": "<-ms-filter-function-progid>|<-ms-filter-function-legacy>",
+ "-ms-filter-function-progid": "'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]",
+ "-ms-filter-function-legacy": "<ident-token>|<function-token> <any-value>? )",
+ "-ms-filter": "<string>",
+ "age": "child|young|old",
+ "attr-name": "<wq-name>",
+ "attr-fallback": "<any-value>",
+ "border-radius": "<length-percentage>{1,2}",
+ "bottom": "<length>|auto",
+ "generic-voice": "[<age>? <gender> <integer>?]",
+ "gender": "male|female|neutral",
+ "left": "<length>|auto",
+ "mask-image": "<mask-reference>#",
+ "name-repeat": "repeat( [<positive-integer>|auto-fill] , <line-names>+ )",
+ "paint": "none|<color>|<url> [none|<color>]?|context-fill|context-stroke",
+ "page-size": "A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",
+ "ratio": "<integer> / <integer>",
+ "right": "<length>|auto",
+ "svg-length": "<percentage>|<length>|<number>",
+ "svg-writing-mode": "lr-tb|rl-tb|tb-rl|lr|rl|tb",
+ "top": "<length>|auto",
+ "track-group": "'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>",
+ "track-list-v0": "[<string>* <track-group> <string>*]+|none",
+ "track-minmax": "minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",
+ "x": "<number>",
+ "y": "<number>",
+ "declaration": "<ident-token> : <declaration-value>? ['!' important]?",
+ "declaration-list": "[<declaration>? ';']* <declaration>?",
+ "url": "url( <string> <url-modifier>* )|<url-token>",
+ "url-modifier": "<ident>|<function-token> <any-value> )",
+ "number-zero-one": "<number [0,1]>",
+ "number-one-or-greater": "<number [1,∞]>",
+ "positive-integer": "<integer [0,∞]>",
+ "-non-standard-display": "-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"
+ },
+ "properties": {
+ "--*": "<declaration-value>",
+ "-ms-accelerator": "false|true",
+ "-ms-block-progression": "tb|rl|bt|lr",
+ "-ms-content-zoom-chaining": "none|chained",
+ "-ms-content-zooming": "none|zoom",
+ "-ms-content-zoom-limit": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",
+ "-ms-content-zoom-limit-max": "<percentage>",
+ "-ms-content-zoom-limit-min": "<percentage>",
+ "-ms-content-zoom-snap": "<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>",
+ "-ms-content-zoom-snap-points": "snapInterval( <percentage> , <percentage> )|snapList( <percentage># )",
+ "-ms-content-zoom-snap-type": "none|proximity|mandatory",
+ "-ms-filter": "<string>",
+ "-ms-flow-from": "[none|<custom-ident>]#",
+ "-ms-flow-into": "[none|<custom-ident>]#",
+ "-ms-grid-columns": "none|<track-list>|<auto-track-list>",
+ "-ms-grid-rows": "none|<track-list>|<auto-track-list>",
+ "-ms-high-contrast-adjust": "auto|none",
+ "-ms-hyphenate-limit-chars": "auto|<integer>{1,3}",
+ "-ms-hyphenate-limit-lines": "no-limit|<integer>",
+ "-ms-hyphenate-limit-zone": "<percentage>|<length>",
+ "-ms-ime-align": "auto|after",
+ "-ms-overflow-style": "auto|none|scrollbar|-ms-autohiding-scrollbar",
+ "-ms-scrollbar-3dlight-color": "<color>",
+ "-ms-scrollbar-arrow-color": "<color>",
+ "-ms-scrollbar-base-color": "<color>",
+ "-ms-scrollbar-darkshadow-color": "<color>",
+ "-ms-scrollbar-face-color": "<color>",
+ "-ms-scrollbar-highlight-color": "<color>",
+ "-ms-scrollbar-shadow-color": "<color>",
+ "-ms-scrollbar-track-color": "<color>",
+ "-ms-scroll-chaining": "chained|none",
+ "-ms-scroll-limit": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",
+ "-ms-scroll-limit-x-max": "auto|<length>",
+ "-ms-scroll-limit-x-min": "<length>",
+ "-ms-scroll-limit-y-max": "auto|<length>",
+ "-ms-scroll-limit-y-min": "<length>",
+ "-ms-scroll-rails": "none|railed",
+ "-ms-scroll-snap-points-x": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )",
+ "-ms-scroll-snap-points-y": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )",
+ "-ms-scroll-snap-type": "none|proximity|mandatory",
+ "-ms-scroll-snap-x": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",
+ "-ms-scroll-snap-y": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",
+ "-ms-scroll-translation": "none|vertical-to-horizontal",
+ "-ms-text-autospace": "none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space",
+ "-ms-touch-select": "grippers|none",
+ "-ms-user-select": "none|element|text",
+ "-ms-wrap-flow": "auto|both|start|end|maximum|clear",
+ "-ms-wrap-margin": "<length>",
+ "-ms-wrap-through": "wrap|none",
+ "-moz-appearance": "none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized",
+ "-moz-binding": "<url>|none",
+ "-moz-border-bottom-colors": "<color>+|none",
+ "-moz-border-left-colors": "<color>+|none",
+ "-moz-border-right-colors": "<color>+|none",
+ "-moz-border-top-colors": "<color>+|none",
+ "-moz-context-properties": "none|[fill|fill-opacity|stroke|stroke-opacity]#",
+ "-moz-float-edge": "border-box|content-box|margin-box|padding-box",
+ "-moz-force-broken-image-icon": "<integer [0,1]>",
+ "-moz-image-region": "<shape>|auto",
+ "-moz-orient": "inline|block|horizontal|vertical",
+ "-moz-outline-radius": "<outline-radius>{1,4} [/ <outline-radius>{1,4}]?",
+ "-moz-outline-radius-bottomleft": "<outline-radius>",
+ "-moz-outline-radius-bottomright": "<outline-radius>",
+ "-moz-outline-radius-topleft": "<outline-radius>",
+ "-moz-outline-radius-topright": "<outline-radius>",
+ "-moz-stack-sizing": "ignore|stretch-to-fit",
+ "-moz-text-blink": "none|blink",
+ "-moz-user-focus": "ignore|normal|select-after|select-before|select-menu|select-same|select-all|none",
+ "-moz-user-input": "auto|none|enabled|disabled",
+ "-moz-user-modify": "read-only|read-write|write-only",
+ "-moz-window-dragging": "drag|no-drag",
+ "-moz-window-shadow": "default|menu|tooltip|sheet|none",
+ "-webkit-appearance": "none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button",
+ "-webkit-border-before": "<'border-width'>||<'border-style'>||<'color'>",
+ "-webkit-border-before-color": "<'color'>",
+ "-webkit-border-before-style": "<'border-style'>",
+ "-webkit-border-before-width": "<'border-width'>",
+ "-webkit-box-reflect": "[above|below|right|left]? <length>? <image>?",
+ "-webkit-line-clamp": "none|<integer>",
+ "-webkit-mask": "[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#",
+ "-webkit-mask-attachment": "<attachment>#",
+ "-webkit-mask-clip": "[<box>|border|padding|content|text]#",
+ "-webkit-mask-composite": "<composite-style>#",
+ "-webkit-mask-image": "<mask-reference>#",
+ "-webkit-mask-origin": "[<box>|border|padding|content]#",
+ "-webkit-mask-position": "<position>#",
+ "-webkit-mask-position-x": "[<length-percentage>|left|center|right]#",
+ "-webkit-mask-position-y": "[<length-percentage>|top|center|bottom]#",
+ "-webkit-mask-repeat": "<repeat-style>#",
+ "-webkit-mask-repeat-x": "repeat|no-repeat|space|round",
+ "-webkit-mask-repeat-y": "repeat|no-repeat|space|round",
+ "-webkit-mask-size": "<bg-size>#",
+ "-webkit-overflow-scrolling": "auto|touch",
+ "-webkit-tap-highlight-color": "<color>",
+ "-webkit-text-fill-color": "<color>",
+ "-webkit-text-stroke": "<length>||<color>",
+ "-webkit-text-stroke-color": "<color>",
+ "-webkit-text-stroke-width": "<length>",
+ "-webkit-touch-callout": "default|none",
+ "-webkit-user-modify": "read-only|read-write|read-write-plaintext-only",
+ "align-content": "normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>",
+ "align-items": "normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]",
+ "align-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>",
+ "align-tracks": "[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",
+ "all": "initial|inherit|unset|revert",
+ "animation": "<single-animation>#",
+ "animation-delay": "<time>#",
+ "animation-direction": "<single-animation-direction>#",
+ "animation-duration": "<time>#",
+ "animation-fill-mode": "<single-animation-fill-mode>#",
+ "animation-iteration-count": "<single-animation-iteration-count>#",
+ "animation-name": "[none|<keyframes-name>]#",
+ "animation-play-state": "<single-animation-play-state>#",
+ "animation-timing-function": "<timing-function>#",
+ "appearance": "none|auto|textfield|menulist-button|<compat-auto>",
+ "aspect-ratio": "auto|<ratio>",
+ "azimuth": "<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards",
+ "backdrop-filter": "none|<filter-function-list>",
+ "backface-visibility": "visible|hidden",
+ "background": "[<bg-layer> ,]* <final-bg-layer>",
+ "background-attachment": "<attachment>#",
+ "background-blend-mode": "<blend-mode>#",
+ "background-clip": "<box>#",
+ "background-color": "<color>",
+ "background-image": "<bg-image>#",
+ "background-origin": "<box>#",
+ "background-position": "<bg-position>#",
+ "background-position-x": "[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#",
+ "background-position-y": "[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#",
+ "background-repeat": "<repeat-style>#",
+ "background-size": "<bg-size>#",
+ "block-overflow": "clip|ellipsis|<string>",
+ "block-size": "<'width'>",
+ "border": "<line-width>||<line-style>||<color>",
+ "border-block": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-block-color": "<'border-top-color'>{1,2}",
+ "border-block-style": "<'border-top-style'>",
+ "border-block-width": "<'border-top-width'>",
+ "border-block-end": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-block-end-color": "<'border-top-color'>",
+ "border-block-end-style": "<'border-top-style'>",
+ "border-block-end-width": "<'border-top-width'>",
+ "border-block-start": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-block-start-color": "<'border-top-color'>",
+ "border-block-start-style": "<'border-top-style'>",
+ "border-block-start-width": "<'border-top-width'>",
+ "border-bottom": "<line-width>||<line-style>||<color>",
+ "border-bottom-color": "<'border-top-color'>",
+ "border-bottom-left-radius": "<length-percentage>{1,2}",
+ "border-bottom-right-radius": "<length-percentage>{1,2}",
+ "border-bottom-style": "<line-style>",
+ "border-bottom-width": "<line-width>",
+ "border-collapse": "collapse|separate",
+ "border-color": "<color>{1,4}",
+ "border-end-end-radius": "<length-percentage>{1,2}",
+ "border-end-start-radius": "<length-percentage>{1,2}",
+ "border-image": "<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>",
+ "border-image-outset": "[<length>|<number>]{1,4}",
+ "border-image-repeat": "[stretch|repeat|round|space]{1,2}",
+ "border-image-slice": "<number-percentage>{1,4}&&fill?",
+ "border-image-source": "none|<image>",
+ "border-image-width": "[<length-percentage>|<number>|auto]{1,4}",
+ "border-inline": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-inline-end": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-inline-color": "<'border-top-color'>{1,2}",
+ "border-inline-style": "<'border-top-style'>",
+ "border-inline-width": "<'border-top-width'>",
+ "border-inline-end-color": "<'border-top-color'>",
+ "border-inline-end-style": "<'border-top-style'>",
+ "border-inline-end-width": "<'border-top-width'>",
+ "border-inline-start": "<'border-top-width'>||<'border-top-style'>||<'color'>",
+ "border-inline-start-color": "<'border-top-color'>",
+ "border-inline-start-style": "<'border-top-style'>",
+ "border-inline-start-width": "<'border-top-width'>",
+ "border-left": "<line-width>||<line-style>||<color>",
+ "border-left-color": "<color>",
+ "border-left-style": "<line-style>",
+ "border-left-width": "<line-width>",
+ "border-radius": "<length-percentage>{1,4} [/ <length-percentage>{1,4}]?",
+ "border-right": "<line-width>||<line-style>||<color>",
+ "border-right-color": "<color>",
+ "border-right-style": "<line-style>",
+ "border-right-width": "<line-width>",
+ "border-spacing": "<length> <length>?",
+ "border-start-end-radius": "<length-percentage>{1,2}",
+ "border-start-start-radius": "<length-percentage>{1,2}",
+ "border-style": "<line-style>{1,4}",
+ "border-top": "<line-width>||<line-style>||<color>",
+ "border-top-color": "<color>",
+ "border-top-left-radius": "<length-percentage>{1,2}",
+ "border-top-right-radius": "<length-percentage>{1,2}",
+ "border-top-style": "<line-style>",
+ "border-top-width": "<line-width>",
+ "border-width": "<line-width>{1,4}",
+ "bottom": "<length>|<percentage>|auto",
+ "box-align": "start|center|end|baseline|stretch",
+ "box-decoration-break": "slice|clone",
+ "box-direction": "normal|reverse|inherit",
+ "box-flex": "<number>",
+ "box-flex-group": "<integer>",
+ "box-lines": "single|multiple",
+ "box-ordinal-group": "<integer>",
+ "box-orient": "horizontal|vertical|inline-axis|block-axis|inherit",
+ "box-pack": "start|center|end|justify",
+ "box-shadow": "none|<shadow>#",
+ "box-sizing": "content-box|border-box",
+ "break-after": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region",
+ "break-before": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region",
+ "break-inside": "auto|avoid|avoid-page|avoid-column|avoid-region",
+ "caption-side": "top|bottom|block-start|block-end|inline-start|inline-end",
+ "caret-color": "auto|<color>",
+ "clear": "none|left|right|both|inline-start|inline-end",
+ "clip": "<shape>|auto",
+ "clip-path": "<clip-source>|[<basic-shape>||<geometry-box>]|none",
+ "color": "<color>",
+ "color-adjust": "economy|exact",
+ "column-count": "<integer>|auto",
+ "column-fill": "auto|balance|balance-all",
+ "column-gap": "normal|<length-percentage>",
+ "column-rule": "<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>",
+ "column-rule-color": "<color>",
+ "column-rule-style": "<'border-style'>",
+ "column-rule-width": "<'border-width'>",
+ "column-span": "none|all",
+ "column-width": "<length>|auto",
+ "columns": "<'column-width'>||<'column-count'>",
+ "contain": "none|strict|content|[size||layout||style||paint]",
+ "content": "normal|none|[<content-replacement>|<content-list>] [/ <string>]?",
+ "counter-increment": "[<custom-ident> <integer>?]+|none",
+ "counter-reset": "[<custom-ident> <integer>?]+|none",
+ "counter-set": "[<custom-ident> <integer>?]+|none",
+ "cursor": "[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",
+ "direction": "ltr|rtl",
+ "display": "[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>",
+ "empty-cells": "show|hide",
+ "filter": "none|<filter-function-list>|<-ms-filter-function-list>",
+ "flex": "none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]",
+ "flex-basis": "content|<'width'>",
+ "flex-direction": "row|row-reverse|column|column-reverse",
+ "flex-flow": "<'flex-direction'>||<'flex-wrap'>",
+ "flex-grow": "<number>",
+ "flex-shrink": "<number>",
+ "flex-wrap": "nowrap|wrap|wrap-reverse",
+ "float": "left|right|none|inline-start|inline-end",
+ "font": "[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar",
+ "font-family": "[<family-name>|<generic-family>]#",
+ "font-feature-settings": "normal|<feature-tag-value>#",
+ "font-kerning": "auto|normal|none",
+ "font-language-override": "normal|<string>",
+ "font-optical-sizing": "auto|none",
+ "font-variation-settings": "normal|[<string> <number>]#",
+ "font-size": "<absolute-size>|<relative-size>|<length-percentage>",
+ "font-size-adjust": "none|<number>",
+ "font-smooth": "auto|never|always|<absolute-size>|<length>",
+ "font-stretch": "<font-stretch-absolute>",
+ "font-style": "normal|italic|oblique <angle>?",
+ "font-synthesis": "none|[weight||style]",
+ "font-variant": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+ "font-variant-alternates": "normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]",
+ "font-variant-caps": "normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps",
+ "font-variant-east-asian": "normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+ "font-variant-ligatures": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]",
+ "font-variant-numeric": "normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]",
+ "font-variant-position": "normal|sub|super",
+ "font-weight": "<font-weight-absolute>|bolder|lighter",
+ "gap": "<'row-gap'> <'column-gap'>?",
+ "grid": "<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>",
+ "grid-area": "<grid-line> [/ <grid-line>]{0,3}",
+ "grid-auto-columns": "<track-size>+",
+ "grid-auto-flow": "[row|column]||dense",
+ "grid-auto-rows": "<track-size>+",
+ "grid-column": "<grid-line> [/ <grid-line>]?",
+ "grid-column-end": "<grid-line>",
+ "grid-column-gap": "<length-percentage>",
+ "grid-column-start": "<grid-line>",
+ "grid-gap": "<'grid-row-gap'> <'grid-column-gap'>?",
+ "grid-row": "<grid-line> [/ <grid-line>]?",
+ "grid-row-end": "<grid-line>",
+ "grid-row-gap": "<length-percentage>",
+ "grid-row-start": "<grid-line>",
+ "grid-template": "none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?",
+ "grid-template-areas": "none|<string>+",
+ "grid-template-columns": "none|<track-list>|<auto-track-list>|subgrid <line-name-list>?",
+ "grid-template-rows": "none|<track-list>|<auto-track-list>|subgrid <line-name-list>?",
+ "hanging-punctuation": "none|[first||[force-end|allow-end]||last]",
+ "height": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",
+ "hyphens": "none|manual|auto",
+ "image-orientation": "from-image|<angle>|[<angle>? flip]",
+ "image-rendering": "auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>",
+ "image-resolution": "[from-image||<resolution>]&&snap?",
+ "ime-mode": "auto|normal|active|inactive|disabled",
+ "initial-letter": "normal|[<number> <integer>?]",
+ "initial-letter-align": "[auto|alphabetic|hanging|ideographic]",
+ "inline-size": "<'width'>",
+ "inset": "<'top'>{1,4}",
+ "inset-block": "<'top'>{1,2}",
+ "inset-block-end": "<'top'>",
+ "inset-block-start": "<'top'>",
+ "inset-inline": "<'top'>{1,2}",
+ "inset-inline-end": "<'top'>",
+ "inset-inline-start": "<'top'>",
+ "isolation": "auto|isolate",
+ "justify-content": "normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]",
+ "justify-items": "normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]",
+ "justify-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]",
+ "justify-tracks": "[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",
+ "left": "<length>|<percentage>|auto",
+ "letter-spacing": "normal|<length-percentage>",
+ "line-break": "auto|loose|normal|strict|anywhere",
+ "line-clamp": "none|<integer>",
+ "line-height": "normal|<number>|<length>|<percentage>",
+ "line-height-step": "<length>",
+ "list-style": "<'list-style-type'>||<'list-style-position'>||<'list-style-image'>",
+ "list-style-image": "<url>|none",
+ "list-style-position": "inside|outside",
+ "list-style-type": "<counter-style>|<string>|none",
+ "margin": "[<length>|<percentage>|auto]{1,4}",
+ "margin-block": "<'margin-left'>{1,2}",
+ "margin-block-end": "<'margin-left'>",
+ "margin-block-start": "<'margin-left'>",
+ "margin-bottom": "<length>|<percentage>|auto",
+ "margin-inline": "<'margin-left'>{1,2}",
+ "margin-inline-end": "<'margin-left'>",
+ "margin-inline-start": "<'margin-left'>",
+ "margin-left": "<length>|<percentage>|auto",
+ "margin-right": "<length>|<percentage>|auto",
+ "margin-top": "<length>|<percentage>|auto",
+ "margin-trim": "none|in-flow|all",
+ "mask": "<mask-layer>#",
+ "mask-border": "<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>",
+ "mask-border-mode": "luminance|alpha",
+ "mask-border-outset": "[<length>|<number>]{1,4}",
+ "mask-border-repeat": "[stretch|repeat|round|space]{1,2}",
+ "mask-border-slice": "<number-percentage>{1,4} fill?",
+ "mask-border-source": "none|<image>",
+ "mask-border-width": "[<length-percentage>|<number>|auto]{1,4}",
+ "mask-clip": "[<geometry-box>|no-clip]#",
+ "mask-composite": "<compositing-operator>#",
+ "mask-image": "<mask-reference>#",
+ "mask-mode": "<masking-mode>#",
+ "mask-origin": "<geometry-box>#",
+ "mask-position": "<position>#",
+ "mask-repeat": "<repeat-style>#",
+ "mask-size": "<bg-size>#",
+ "mask-type": "luminance|alpha",
+ "masonry-auto-flow": "[pack|next]||[definite-first|ordered]",
+ "math-style": "normal|compact",
+ "max-block-size": "<'max-width'>",
+ "max-height": "none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )",
+ "max-inline-size": "<'max-width'>",
+ "max-lines": "none|<integer>",
+ "max-width": "none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>",
+ "min-block-size": "<'min-width'>",
+ "min-height": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",
+ "min-inline-size": "<'min-width'>",
+ "min-width": "auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>",
+ "mix-blend-mode": "<blend-mode>",
+ "object-fit": "fill|contain|cover|none|scale-down",
+ "object-position": "<position>",
+ "offset": "[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?",
+ "offset-anchor": "auto|<position>",
+ "offset-distance": "<length-percentage>",
+ "offset-path": "none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]",
+ "offset-position": "auto|<position>",
+ "offset-rotate": "[auto|reverse]||<angle>",
+ "opacity": "<alpha-value>",
+ "order": "<integer>",
+ "orphans": "<integer>",
+ "outline": "[<'outline-color'>||<'outline-style'>||<'outline-width'>]",
+ "outline-color": "<color>|invert",
+ "outline-offset": "<length>",
+ "outline-style": "auto|<'border-style'>",
+ "outline-width": "<line-width>",
+ "overflow": "[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>",
+ "overflow-anchor": "auto|none",
+ "overflow-block": "visible|hidden|clip|scroll|auto",
+ "overflow-clip-box": "padding-box|content-box",
+ "overflow-inline": "visible|hidden|clip|scroll|auto",
+ "overflow-wrap": "normal|break-word|anywhere",
+ "overflow-x": "visible|hidden|clip|scroll|auto",
+ "overflow-y": "visible|hidden|clip|scroll|auto",
+ "overscroll-behavior": "[contain|none|auto]{1,2}",
+ "overscroll-behavior-block": "contain|none|auto",
+ "overscroll-behavior-inline": "contain|none|auto",
+ "overscroll-behavior-x": "contain|none|auto",
+ "overscroll-behavior-y": "contain|none|auto",
+ "padding": "[<length>|<percentage>]{1,4}",
+ "padding-block": "<'padding-left'>{1,2}",
+ "padding-block-end": "<'padding-left'>",
+ "padding-block-start": "<'padding-left'>",
+ "padding-bottom": "<length>|<percentage>",
+ "padding-inline": "<'padding-left'>{1,2}",
+ "padding-inline-end": "<'padding-left'>",
+ "padding-inline-start": "<'padding-left'>",
+ "padding-left": "<length>|<percentage>",
+ "padding-right": "<length>|<percentage>",
+ "padding-top": "<length>|<percentage>",
+ "page-break-after": "auto|always|avoid|left|right|recto|verso",
+ "page-break-before": "auto|always|avoid|left|right|recto|verso",
+ "page-break-inside": "auto|avoid",
+ "paint-order": "normal|[fill||stroke||markers]",
+ "perspective": "none|<length>",
+ "perspective-origin": "<position>",
+ "place-content": "<'align-content'> <'justify-content'>?",
+ "place-items": "<'align-items'> <'justify-items'>?",
+ "place-self": "<'align-self'> <'justify-self'>?",
+ "pointer-events": "auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",
+ "position": "static|relative|absolute|sticky|fixed|-webkit-sticky",
+ "quotes": "none|auto|[<string> <string>]+",
+ "resize": "none|both|horizontal|vertical|block|inline",
+ "right": "<length>|<percentage>|auto",
+ "rotate": "none|<angle>|[x|y|z|<number>{3}]&&<angle>",
+ "row-gap": "normal|<length-percentage>",
+ "ruby-align": "start|center|space-between|space-around",
+ "ruby-merge": "separate|collapse|auto",
+ "ruby-position": "over|under|inter-character",
+ "scale": "none|<number>{1,3}",
+ "scrollbar-color": "auto|dark|light|<color>{2}",
+ "scrollbar-gutter": "auto|[stable|always]&&both?&&force?",
+ "scrollbar-width": "auto|thin|none",
+ "scroll-behavior": "auto|smooth",
+ "scroll-margin": "<length>{1,4}",
+ "scroll-margin-block": "<length>{1,2}",
+ "scroll-margin-block-start": "<length>",
+ "scroll-margin-block-end": "<length>",
+ "scroll-margin-bottom": "<length>",
+ "scroll-margin-inline": "<length>{1,2}",
+ "scroll-margin-inline-start": "<length>",
+ "scroll-margin-inline-end": "<length>",
+ "scroll-margin-left": "<length>",
+ "scroll-margin-right": "<length>",
+ "scroll-margin-top": "<length>",
+ "scroll-padding": "[auto|<length-percentage>]{1,4}",
+ "scroll-padding-block": "[auto|<length-percentage>]{1,2}",
+ "scroll-padding-block-start": "auto|<length-percentage>",
+ "scroll-padding-block-end": "auto|<length-percentage>",
+ "scroll-padding-bottom": "auto|<length-percentage>",
+ "scroll-padding-inline": "[auto|<length-percentage>]{1,2}",
+ "scroll-padding-inline-start": "auto|<length-percentage>",
+ "scroll-padding-inline-end": "auto|<length-percentage>",
+ "scroll-padding-left": "auto|<length-percentage>",
+ "scroll-padding-right": "auto|<length-percentage>",
+ "scroll-padding-top": "auto|<length-percentage>",
+ "scroll-snap-align": "[none|start|end|center]{1,2}",
+ "scroll-snap-coordinate": "none|<position>#",
+ "scroll-snap-destination": "<position>",
+ "scroll-snap-points-x": "none|repeat( <length-percentage> )",
+ "scroll-snap-points-y": "none|repeat( <length-percentage> )",
+ "scroll-snap-stop": "normal|always",
+ "scroll-snap-type": "none|[x|y|block|inline|both] [mandatory|proximity]?",
+ "scroll-snap-type-x": "none|mandatory|proximity",
+ "scroll-snap-type-y": "none|mandatory|proximity",
+ "shape-image-threshold": "<alpha-value>",
+ "shape-margin": "<length-percentage>",
+ "shape-outside": "none|<shape-box>||<basic-shape>|<image>",
+ "tab-size": "<integer>|<length>",
+ "table-layout": "auto|fixed",
+ "text-align": "start|end|left|right|center|justify|match-parent",
+ "text-align-last": "auto|start|end|left|right|center|justify",
+ "text-combine-upright": "none|all|[digits <integer>?]",
+ "text-decoration": "<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>",
+ "text-decoration-color": "<color>",
+ "text-decoration-line": "none|[underline||overline||line-through||blink]|spelling-error|grammar-error",
+ "text-decoration-skip": "none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]",
+ "text-decoration-skip-ink": "auto|all|none",
+ "text-decoration-style": "solid|double|dotted|dashed|wavy",
+ "text-decoration-thickness": "auto|from-font|<length>|<percentage>",
+ "text-emphasis": "<'text-emphasis-style'>||<'text-emphasis-color'>",
+ "text-emphasis-color": "<color>",
+ "text-emphasis-position": "[over|under]&&[right|left]",
+ "text-emphasis-style": "none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>",
+ "text-indent": "<length-percentage>&&hanging?&&each-line?",
+ "text-justify": "auto|inter-character|inter-word|none",
+ "text-orientation": "mixed|upright|sideways",
+ "text-overflow": "[clip|ellipsis|<string>]{1,2}",
+ "text-rendering": "auto|optimizeSpeed|optimizeLegibility|geometricPrecision",
+ "text-shadow": "none|<shadow-t>#",
+ "text-size-adjust": "none|auto|<percentage>",
+ "text-transform": "none|capitalize|uppercase|lowercase|full-width|full-size-kana",
+ "text-underline-offset": "auto|<length>|<percentage>",
+ "text-underline-position": "auto|from-font|[under||[left|right]]",
+ "top": "<length>|<percentage>|auto",
+ "touch-action": "auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",
+ "transform": "none|<transform-list>",
+ "transform-box": "content-box|border-box|fill-box|stroke-box|view-box",
+ "transform-origin": "[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?",
+ "transform-style": "flat|preserve-3d",
+ "transition": "<single-transition>#",
+ "transition-delay": "<time>#",
+ "transition-duration": "<time>#",
+ "transition-property": "none|<single-transition-property>#",
+ "transition-timing-function": "<timing-function>#",
+ "translate": "none|<length-percentage> [<length-percentage> <length>?]?",
+ "unicode-bidi": "normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext",
+ "user-select": "auto|text|none|contain|all",
+ "vertical-align": "baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",
+ "visibility": "visible|hidden|collapse",
+ "white-space": "normal|pre|nowrap|pre-wrap|pre-line|break-spaces",
+ "widows": "<integer>",
+ "width": "auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",
+ "will-change": "auto|<animateable-feature>#",
+ "word-break": "normal|break-all|keep-all|break-word",
+ "word-spacing": "normal|<length-percentage>",
+ "word-wrap": "normal|break-word",
+ "writing-mode": "horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>",
+ "z-index": "auto|<integer>",
+ "zoom": "normal|reset|<number>|<percentage>",
+ "-moz-background-clip": "padding|border",
+ "-moz-border-radius-bottomleft": "<'border-bottom-left-radius'>",
+ "-moz-border-radius-bottomright": "<'border-bottom-right-radius'>",
+ "-moz-border-radius-topleft": "<'border-top-left-radius'>",
+ "-moz-border-radius-topright": "<'border-bottom-right-radius'>",
+ "-moz-control-character-visibility": "visible|hidden",
+ "-moz-osx-font-smoothing": "auto|grayscale",
+ "-moz-user-select": "none|text|all|-moz-none",
+ "-ms-flex-align": "start|end|center|baseline|stretch",
+ "-ms-flex-item-align": "auto|start|end|center|baseline|stretch",
+ "-ms-flex-line-pack": "start|end|center|justify|distribute|stretch",
+ "-ms-flex-negative": "<'flex-shrink'>",
+ "-ms-flex-pack": "start|end|center|justify|distribute",
+ "-ms-flex-order": "<integer>",
+ "-ms-flex-positive": "<'flex-grow'>",
+ "-ms-flex-preferred-size": "<'flex-basis'>",
+ "-ms-interpolation-mode": "nearest-neighbor|bicubic",
+ "-ms-grid-column-align": "start|end|center|stretch",
+ "-ms-grid-row-align": "start|end|center|stretch",
+ "-ms-hyphenate-limit-last": "none|always|column|page|spread",
+ "-webkit-background-clip": "[<box>|border|padding|content|text]#",
+ "-webkit-column-break-after": "always|auto|avoid",
+ "-webkit-column-break-before": "always|auto|avoid",
+ "-webkit-column-break-inside": "always|auto|avoid",
+ "-webkit-font-smoothing": "auto|none|antialiased|subpixel-antialiased",
+ "-webkit-mask-box-image": "[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?",
+ "-webkit-print-color-adjust": "economy|exact",
+ "-webkit-text-security": "none|circle|disc|square",
+ "-webkit-user-drag": "none|element|auto",
+ "-webkit-user-select": "auto|none|text|all",
+ "alignment-baseline": "auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical",
+ "baseline-shift": "baseline|sub|super|<svg-length>",
+ "behavior": "<url>+",
+ "clip-rule": "nonzero|evenodd",
+ "cue": "<'cue-before'> <'cue-after'>?",
+ "cue-after": "<url> <decibel>?|none",
+ "cue-before": "<url> <decibel>?|none",
+ "dominant-baseline": "auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",
+ "fill": "<paint>",
+ "fill-opacity": "<number-zero-one>",
+ "fill-rule": "nonzero|evenodd",
+ "glyph-orientation-horizontal": "<angle>",
+ "glyph-orientation-vertical": "<angle>",
+ "kerning": "auto|<svg-length>",
+ "marker": "none|<url>",
+ "marker-end": "none|<url>",
+ "marker-mid": "none|<url>",
+ "marker-start": "none|<url>",
+ "pause": "<'pause-before'> <'pause-after'>?",
+ "pause-after": "<time>|none|x-weak|weak|medium|strong|x-strong",
+ "pause-before": "<time>|none|x-weak|weak|medium|strong|x-strong",
+ "rest": "<'rest-before'> <'rest-after'>?",
+ "rest-after": "<time>|none|x-weak|weak|medium|strong|x-strong",
+ "rest-before": "<time>|none|x-weak|weak|medium|strong|x-strong",
+ "shape-rendering": "auto|optimizeSpeed|crispEdges|geometricPrecision",
+ "src": "[<url> [format( <string># )]?|local( <family-name> )]#",
+ "speak": "auto|none|normal",
+ "speak-as": "normal|spell-out||digits||[literal-punctuation|no-punctuation]",
+ "stroke": "<paint>",
+ "stroke-dasharray": "none|[<svg-length>+]#",
+ "stroke-dashoffset": "<svg-length>",
+ "stroke-linecap": "butt|round|square",
+ "stroke-linejoin": "miter|round|bevel",
+ "stroke-miterlimit": "<number-one-or-greater>",
+ "stroke-opacity": "<number-zero-one>",
+ "stroke-width": "<svg-length>",
+ "text-anchor": "start|middle|end",
+ "unicode-range": "<urange>#",
+ "voice-balance": "<number>|left|center|right|leftwards|rightwards",
+ "voice-duration": "auto|<time>",
+ "voice-family": "[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve",
+ "voice-pitch": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]",
+ "voice-range": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]",
+ "voice-rate": "[normal|x-slow|slow|medium|fast|x-fast]||<percentage>",
+ "voice-stress": "normal|strong|moderate|none|reduced",
+ "voice-volume": "silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"
+ },
+ "atrules": {
+ "charset": {
+ "prelude": "<string>",
+ "descriptors": null
+ },
+ "counter-style": {
+ "prelude": "<counter-style-name>",
+ "descriptors": {
+ "additive-symbols": "[<integer>&&<symbol>]#",
+ "fallback": "<counter-style-name>",
+ "negative": "<symbol> <symbol>?",
+ "pad": "<integer>&&<symbol>",
+ "prefix": "<symbol>",
+ "range": "[[<integer>|infinite]{2}]#|auto",
+ "speak-as": "auto|bullets|numbers|words|spell-out|<counter-style-name>",
+ "suffix": "<symbol>",
+ "symbols": "<symbol>+",
+ "system": "cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"
+ }
+ },
+ "document": {
+ "prelude": "[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",
+ "descriptors": null
+ },
+ "font-face": {
+ "prelude": null,
+ "descriptors": {
+ "font-display": "[auto|block|swap|fallback|optional]",
+ "font-family": "<family-name>",
+ "font-feature-settings": "normal|<feature-tag-value>#",
+ "font-variation-settings": "normal|[<string> <number>]#",
+ "font-stretch": "<font-stretch-absolute>{1,2}",
+ "font-style": "normal|italic|oblique <angle>{0,2}",
+ "font-weight": "<font-weight-absolute>{1,2}",
+ "font-variant": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",
+ "src": "[<url> [format( <string># )]?|local( <family-name> )]#",
+ "unicode-range": "<urange>#"
+ }
+ },
+ "font-feature-values": {
+ "prelude": "<family-name>#",
+ "descriptors": null
+ },
+ "import": {
+ "prelude": "[<string>|<url>] [<media-query-list>]?",
+ "descriptors": null
+ },
+ "keyframes": {
+ "prelude": "<keyframes-name>",
+ "descriptors": null
+ },
+ "media": {
+ "prelude": "<media-query-list>",
+ "descriptors": null
+ },
+ "namespace": {
+ "prelude": "<namespace-prefix>? [<string>|<url>]",
+ "descriptors": null
+ },
+ "page": {
+ "prelude": "<page-selector-list>",
+ "descriptors": {
+ "bleed": "auto|<length>",
+ "marks": "none|[crop||cross]",
+ "size": "<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"
+ }
+ },
+ "property": {
+ "prelude": "<custom-property-name>",
+ "descriptors": {
+ "syntax": "<string>",
+ "inherits": "true|false",
+ "initial-value": "<string>"
+ }
+ },
+ "supports": {
+ "prelude": "<supports-condition>",
+ "descriptors": null
+ },
+ "viewport": {
+ "prelude": null,
+ "descriptors": {
+ "height": "<viewport-length>{1,2}",
+ "max-height": "<viewport-length>",
+ "max-width": "<viewport-length>",
+ "max-zoom": "auto|<number>|<percentage>",
+ "min-height": "<viewport-length>",
+ "min-width": "<viewport-length>",
+ "min-zoom": "auto|<number>|<percentage>",
+ "orientation": "auto|portrait|landscape",
+ "user-zoom": "zoom|fixed",
+ "viewport-fit": "auto|contain|cover",
+ "width": "<viewport-length>{1,2}",
+ "zoom": "auto|<number>|<percentage>"
+ }
+ }
+ }
+ };
+
+ var cmpChar$3 = tokenizer.cmpChar;
+ var isDigit$4 = tokenizer.isDigit;
+ var TYPE$9 = tokenizer.TYPE;
+
+ var WHITESPACE$4 = TYPE$9.WhiteSpace;
+ var COMMENT$4 = TYPE$9.Comment;
+ var IDENT$3 = TYPE$9.Ident;
+ var NUMBER$3 = TYPE$9.Number;
+ var DIMENSION$2 = TYPE$9.Dimension;
+ var PLUSSIGN$3 = 0x002B; // U+002B PLUS SIGN (+)
+ var HYPHENMINUS$3 = 0x002D; // U+002D HYPHEN-MINUS (-)
+ var N$4 = 0x006E; // U+006E LATIN SMALL LETTER N (n)
+ var DISALLOW_SIGN$1 = true;
+ var ALLOW_SIGN$1 = false;
+
+ function checkInteger$1(offset, disallowSign) {
+ var pos = this.scanner.tokenStart + offset;
+ var code = this.scanner.source.charCodeAt(pos);
+
+ if (code === PLUSSIGN$3 || code === HYPHENMINUS$3) {
+ if (disallowSign) {
+ this.error('Number sign is not allowed');
+ }
+ pos++;
+ }
+
+ for (; pos < this.scanner.tokenEnd; pos++) {
+ if (!isDigit$4(this.scanner.source.charCodeAt(pos))) {
+ this.error('Integer is expected', pos);
+ }
+ }
+ }
+
+ function checkTokenIsInteger(disallowSign) {
+ return checkInteger$1.call(this, 0, disallowSign);
+ }
+
+ function expectCharCode(offset, code) {
+ if (!cmpChar$3(this.scanner.source, this.scanner.tokenStart + offset, code)) {
+ var msg = '';
+
+ switch (code) {
+ case N$4:
+ msg = 'N is expected';
+ break;
+ case HYPHENMINUS$3:
+ msg = 'HyphenMinus is expected';
+ break;
+ }
+
+ this.error(msg, this.scanner.tokenStart + offset);
+ }
+ }
+
+ // ... <signed-integer>
+ // ... ['+' | '-'] <signless-integer>
+ function consumeB$1() {
+ var offset = 0;
+ var sign = 0;
+ var type = this.scanner.tokenType;
+
+ while (type === WHITESPACE$4 || type === COMMENT$4) {
+ type = this.scanner.lookupType(++offset);
+ }
+
+ if (type !== NUMBER$3) {
+ if (this.scanner.isDelim(PLUSSIGN$3, offset) ||
+ this.scanner.isDelim(HYPHENMINUS$3, offset)) {
+ sign = this.scanner.isDelim(PLUSSIGN$3, offset) ? PLUSSIGN$3 : HYPHENMINUS$3;
+
+ do {
+ type = this.scanner.lookupType(++offset);
+ } while (type === WHITESPACE$4 || type === COMMENT$4);
+
+ if (type !== NUMBER$3) {
+ this.scanner.skip(offset);
+ checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ if (offset > 0) {
+ this.scanner.skip(offset);
+ }
+
+ if (sign === 0) {
+ type = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+ if (type !== PLUSSIGN$3 && type !== HYPHENMINUS$3) {
+ this.error('Number sign is expected');
+ }
+ }
+
+ checkTokenIsInteger.call(this, sign !== 0);
+ return sign === HYPHENMINUS$3 ? '-' + this.consume(NUMBER$3) : this.consume(NUMBER$3);
+ }
+
+ // An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+ var AnPlusB = {
+ name: 'AnPlusB',
+ structure: {
+ a: [String, null],
+ b: [String, null]
+ },
+ parse: function() {
+ /* eslint-disable brace-style*/
+ var start = this.scanner.tokenStart;
+ var a = null;
+ var b = null;
+
+ // <integer>
+ if (this.scanner.tokenType === NUMBER$3) {
+ checkTokenIsInteger.call(this, ALLOW_SIGN$1);
+ b = this.consume(NUMBER$3);
+ }
+
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ // -n- <signless-integer>
+ // <dashndashdigit-ident>
+ else if (this.scanner.tokenType === IDENT$3 && cmpChar$3(this.scanner.source, this.scanner.tokenStart, HYPHENMINUS$3)) {
+ a = '-1';
+
+ expectCharCode.call(this, 1, N$4);
+
+ switch (this.scanner.getTokenLength()) {
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ case 2:
+ this.scanner.next();
+ b = consumeB$1.call(this);
+ break;
+
+ // -n- <signless-integer>
+ case 3:
+ expectCharCode.call(this, 2, HYPHENMINUS$3);
+
+ this.scanner.next();
+ this.scanner.skipSC();
+
+ checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+
+ b = '-' + this.consume(NUMBER$3);
+ break;
+
+ // <dashndashdigit-ident>
+ default:
+ expectCharCode.call(this, 2, HYPHENMINUS$3);
+ checkInteger$1.call(this, 3, DISALLOW_SIGN$1);
+ this.scanner.next();
+
+ b = this.scanner.substrToCursor(start + 2);
+ }
+ }
+
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ // '+'? n- <signless-integer>
+ // '+'? <ndashdigit-ident>
+ else if (this.scanner.tokenType === IDENT$3 || (this.scanner.isDelim(PLUSSIGN$3) && this.scanner.lookupType(1) === IDENT$3)) {
+ var sign = 0;
+ a = '1';
+
+ // just ignore a plus
+ if (this.scanner.isDelim(PLUSSIGN$3)) {
+ sign = 1;
+ this.scanner.next();
+ }
+
+ expectCharCode.call(this, 0, N$4);
+
+ switch (this.scanner.getTokenLength()) {
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ case 1:
+ this.scanner.next();
+ b = consumeB$1.call(this);
+ break;
+
+ // '+'? n- <signless-integer>
+ case 2:
+ expectCharCode.call(this, 1, HYPHENMINUS$3);
+
+ this.scanner.next();
+ this.scanner.skipSC();
+
+ checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+
+ b = '-' + this.consume(NUMBER$3);
+ break;
+
+ // '+'? <ndashdigit-ident>
+ default:
+ expectCharCode.call(this, 1, HYPHENMINUS$3);
+ checkInteger$1.call(this, 2, DISALLOW_SIGN$1);
+ this.scanner.next();
+
+ b = this.scanner.substrToCursor(start + sign + 1);
+ }
+ }
+
+ // <ndashdigit-dimension>
+ // <ndash-dimension> <signless-integer>
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ else if (this.scanner.tokenType === DIMENSION$2) {
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+ var sign = code === PLUSSIGN$3 || code === HYPHENMINUS$3;
+
+ for (var i = this.scanner.tokenStart + sign; i < this.scanner.tokenEnd; i++) {
+ if (!isDigit$4(this.scanner.source.charCodeAt(i))) {
+ break;
+ }
+ }
+
+ if (i === this.scanner.tokenStart + sign) {
+ this.error('Integer is expected', this.scanner.tokenStart + sign);
+ }
+
+ expectCharCode.call(this, i - this.scanner.tokenStart, N$4);
+ a = this.scanner.source.substring(start, i);
+
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ if (i + 1 === this.scanner.tokenEnd) {
+ this.scanner.next();
+ b = consumeB$1.call(this);
+ } else {
+ expectCharCode.call(this, i - this.scanner.tokenStart + 1, HYPHENMINUS$3);
+
+ // <ndash-dimension> <signless-integer>
+ if (i + 2 === this.scanner.tokenEnd) {
+ this.scanner.next();
+ this.scanner.skipSC();
+ checkTokenIsInteger.call(this, DISALLOW_SIGN$1);
+ b = '-' + this.consume(NUMBER$3);
+ }
+ // <ndashdigit-dimension>
+ else {
+ checkInteger$1.call(this, i - this.scanner.tokenStart + 2, DISALLOW_SIGN$1);
+ this.scanner.next();
+ b = this.scanner.substrToCursor(i + 1);
+ }
+ }
+ } else {
+ this.error();
+ }
+
+ if (a !== null && a.charCodeAt(0) === PLUSSIGN$3) {
+ a = a.substr(1);
+ }
+
+ if (b !== null && b.charCodeAt(0) === PLUSSIGN$3) {
+ b = b.substr(1);
+ }
+
+ return {
+ type: 'AnPlusB',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ a: a,
+ b: b
+ };
+ },
+ generate: function(node) {
+ var a = node.a !== null && node.a !== undefined;
+ var b = node.b !== null && node.b !== undefined;
+
+ if (a) {
+ this.chunk(
+ node.a === '+1' ? '+n' : // eslint-disable-line operator-linebreak, indent
+ node.a === '1' ? 'n' : // eslint-disable-line operator-linebreak, indent
+ node.a === '-1' ? '-n' : // eslint-disable-line operator-linebreak, indent
+ node.a + 'n' // eslint-disable-line operator-linebreak, indent
+ );
+
+ if (b) {
+ b = String(node.b);
+ if (b.charAt(0) === '-' || b.charAt(0) === '+') {
+ this.chunk(b.charAt(0));
+ this.chunk(b.substr(1));
+ } else {
+ this.chunk('+');
+ this.chunk(b);
+ }
+ }
+ } else {
+ this.chunk(String(node.b));
+ }
+ }
+ };
+
+ var TYPE$a = tokenizer.TYPE;
+
+ var WhiteSpace = TYPE$a.WhiteSpace;
+ var Semicolon = TYPE$a.Semicolon;
+ var LeftCurlyBracket = TYPE$a.LeftCurlyBracket;
+ var Delim = TYPE$a.Delim;
+ var EXCLAMATIONMARK$1 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+ function getOffsetExcludeWS() {
+ if (this.scanner.tokenIndex > 0) {
+ if (this.scanner.lookupType(-1) === WhiteSpace) {
+ return this.scanner.tokenIndex > 1
+ ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
+ : this.scanner.firstCharOffset;
+ }
+ }
+
+ return this.scanner.tokenStart;
+ }
+
+ // 0, 0, false
+ function balanceEnd() {
+ return 0;
+ }
+
+ // LEFTCURLYBRACKET, 0, false
+ function leftCurlyBracket(tokenType) {
+ return tokenType === LeftCurlyBracket ? 1 : 0;
+ }
+
+ // LEFTCURLYBRACKET, SEMICOLON, false
+ function leftCurlyBracketOrSemicolon(tokenType) {
+ return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
+ }
+
+ // EXCLAMATIONMARK, SEMICOLON, false
+ function exclamationMarkOrSemicolon(tokenType, source, offset) {
+ if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK$1) {
+ return 1;
+ }
+
+ return tokenType === Semicolon ? 1 : 0;
+ }
+
+ // 0, SEMICOLON, true
+ function semicolonIncluded(tokenType) {
+ return tokenType === Semicolon ? 2 : 0;
+ }
+
+ var Raw = {
+ name: 'Raw',
+ structure: {
+ value: String
+ },
+ parse: function(startToken, mode, excludeWhiteSpace) {
+ var startOffset = this.scanner.getTokenStart(startToken);
+ var endOffset;
+
+ this.scanner.skip(
+ this.scanner.getRawLength(startToken, mode || balanceEnd)
+ );
+
+ if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
+ endOffset = getOffsetExcludeWS.call(this);
+ } else {
+ endOffset = this.scanner.tokenStart;
+ }
+
+ return {
+ type: 'Raw',
+ loc: this.getLocation(startOffset, endOffset),
+ value: this.scanner.source.substring(startOffset, endOffset)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ },
+
+ mode: {
+ default: balanceEnd,
+ leftCurlyBracket: leftCurlyBracket,
+ leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
+ exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
+ semicolonIncluded: semicolonIncluded
+ }
+ };
+
+ var TYPE$b = tokenizer.TYPE;
+ var rawMode = Raw.mode;
+
+ var ATKEYWORD = TYPE$b.AtKeyword;
+ var SEMICOLON = TYPE$b.Semicolon;
+ var LEFTCURLYBRACKET$1 = TYPE$b.LeftCurlyBracket;
+ var RIGHTCURLYBRACKET$1 = TYPE$b.RightCurlyBracket;
+
+ function consumeRaw(startToken) {
+ return this.Raw(startToken, rawMode.leftCurlyBracketOrSemicolon, true);
+ }
+
+ function isDeclarationBlockAtrule() {
+ for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {
+ if (type === RIGHTCURLYBRACKET$1) {
+ return true;
+ }
+
+ if (type === LEFTCURLYBRACKET$1 ||
+ type === ATKEYWORD) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ var Atrule = {
+ name: 'Atrule',
+ structure: {
+ name: String,
+ prelude: ['AtrulePrelude', 'Raw', null],
+ block: ['Block', null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var nameLowerCase;
+ var prelude = null;
+ var block = null;
+
+ this.eat(ATKEYWORD);
+
+ name = this.scanner.substrToCursor(start + 1);
+ nameLowerCase = name.toLowerCase();
+ this.scanner.skipSC();
+
+ // parse prelude
+ if (this.scanner.eof === false &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET$1 &&
+ this.scanner.tokenType !== SEMICOLON) {
+ if (this.parseAtrulePrelude) {
+ prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw);
+
+ // turn empty AtrulePrelude into null
+ if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {
+ prelude = null;
+ }
+ } else {
+ prelude = consumeRaw.call(this, this.scanner.tokenIndex);
+ }
+
+ this.scanner.skipSC();
+ }
+
+ switch (this.scanner.tokenType) {
+ case SEMICOLON:
+ this.scanner.next();
+ break;
+
+ case LEFTCURLYBRACKET$1:
+ if (this.atrule.hasOwnProperty(nameLowerCase) &&
+ typeof this.atrule[nameLowerCase].block === 'function') {
+ block = this.atrule[nameLowerCase].block.call(this);
+ } else {
+ // TODO: should consume block content as Raw?
+ block = this.Block(isDeclarationBlockAtrule.call(this));
+ }
+
+ break;
+ }
+
+ return {
+ type: 'Atrule',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ prelude: prelude,
+ block: block
+ };
+ },
+ generate: function(node) {
+ this.chunk('@');
+ this.chunk(node.name);
+
+ if (node.prelude !== null) {
+ this.chunk(' ');
+ this.node(node.prelude);
+ }
+
+ if (node.block) {
+ this.node(node.block);
+ } else {
+ this.chunk(';');
+ }
+ },
+ walkContext: 'atrule'
+ };
+
+ var TYPE$c = tokenizer.TYPE;
+
+ var SEMICOLON$1 = TYPE$c.Semicolon;
+ var LEFTCURLYBRACKET$2 = TYPE$c.LeftCurlyBracket;
+
+ var AtrulePrelude = {
+ name: 'AtrulePrelude',
+ structure: {
+ children: [[]]
+ },
+ parse: function(name) {
+ var children = null;
+
+ if (name !== null) {
+ name = name.toLowerCase();
+ }
+
+ this.scanner.skipSC();
+
+ if (this.atrule.hasOwnProperty(name) &&
+ typeof this.atrule[name].prelude === 'function') {
+ // custom consumer
+ children = this.atrule[name].prelude.call(this);
+ } else {
+ // default consumer
+ children = this.readSequence(this.scope.AtrulePrelude);
+ }
+
+ this.scanner.skipSC();
+
+ if (this.scanner.eof !== true &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET$2 &&
+ this.scanner.tokenType !== SEMICOLON$1) {
+ this.error('Semicolon or block is expected');
+ }
+
+ if (children === null) {
+ children = this.createList();
+ }
+
+ return {
+ type: 'AtrulePrelude',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ },
+ walkContext: 'atrulePrelude'
+ };
+
+ var TYPE$d = tokenizer.TYPE;
+
+ var IDENT$4 = TYPE$d.Ident;
+ var STRING = TYPE$d.String;
+ var COLON = TYPE$d.Colon;
+ var LEFTSQUAREBRACKET$1 = TYPE$d.LeftSquareBracket;
+ var RIGHTSQUAREBRACKET$1 = TYPE$d.RightSquareBracket;
+ var DOLLARSIGN = 0x0024; // U+0024 DOLLAR SIGN ($)
+ var ASTERISK$1 = 0x002A; // U+002A ASTERISK (*)
+ var EQUALSSIGN = 0x003D; // U+003D EQUALS SIGN (=)
+ var CIRCUMFLEXACCENT = 0x005E; // U+005E (^)
+ var VERTICALLINE$1 = 0x007C; // U+007C VERTICAL LINE (|)
+ var TILDE = 0x007E; // U+007E TILDE (~)
+
+ function getAttributeName() {
+ if (this.scanner.eof) {
+ this.error('Unexpected end of input');
+ }
+
+ var start = this.scanner.tokenStart;
+ var expectIdent = false;
+ var checkColon = true;
+
+ if (this.scanner.isDelim(ASTERISK$1)) {
+ expectIdent = true;
+ checkColon = false;
+ this.scanner.next();
+ } else if (!this.scanner.isDelim(VERTICALLINE$1)) {
+ this.eat(IDENT$4);
+ }
+
+ if (this.scanner.isDelim(VERTICALLINE$1)) {
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 1) !== EQUALSSIGN) {
+ this.scanner.next();
+ this.eat(IDENT$4);
+ } else if (expectIdent) {
+ this.error('Identifier is expected', this.scanner.tokenEnd);
+ }
+ } else if (expectIdent) {
+ this.error('Vertical line is expected');
+ }
+
+ if (checkColon && this.scanner.tokenType === COLON) {
+ this.scanner.next();
+ this.eat(IDENT$4);
+ }
+
+ return {
+ type: 'Identifier',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+ }
+
+ function getOperator() {
+ var start = this.scanner.tokenStart;
+ var code = this.scanner.source.charCodeAt(start);
+
+ if (code !== EQUALSSIGN && // =
+ code !== TILDE && // ~=
+ code !== CIRCUMFLEXACCENT && // ^=
+ code !== DOLLARSIGN && // $=
+ code !== ASTERISK$1 && // *=
+ code !== VERTICALLINE$1 // |=
+ ) {
+ this.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');
+ }
+
+ this.scanner.next();
+
+ if (code !== EQUALSSIGN) {
+ if (!this.scanner.isDelim(EQUALSSIGN)) {
+ this.error('Equal sign is expected');
+ }
+
+ this.scanner.next();
+ }
+
+ return this.scanner.substrToCursor(start);
+ }
+
+ // '[' <wq-name> ']'
+ // '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
+ var AttributeSelector = {
+ name: 'AttributeSelector',
+ structure: {
+ name: 'Identifier',
+ matcher: [String, null],
+ value: ['String', 'Identifier', null],
+ flags: [String, null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var matcher = null;
+ var value = null;
+ var flags = null;
+
+ this.eat(LEFTSQUAREBRACKET$1);
+ this.scanner.skipSC();
+
+ name = getAttributeName.call(this);
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType !== RIGHTSQUAREBRACKET$1) {
+ // avoid case `[name i]`
+ if (this.scanner.tokenType !== IDENT$4) {
+ matcher = getOperator.call(this);
+
+ this.scanner.skipSC();
+
+ value = this.scanner.tokenType === STRING
+ ? this.String()
+ : this.Identifier();
+
+ this.scanner.skipSC();
+ }
+
+ // attribute flags
+ if (this.scanner.tokenType === IDENT$4) {
+ flags = this.scanner.getTokenValue();
+ this.scanner.next();
+
+ this.scanner.skipSC();
+ }
+ }
+
+ this.eat(RIGHTSQUAREBRACKET$1);
+
+ return {
+ type: 'AttributeSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ matcher: matcher,
+ value: value,
+ flags: flags
+ };
+ },
+ generate: function(node) {
+ var flagsPrefix = ' ';
+
+ this.chunk('[');
+ this.node(node.name);
+
+ if (node.matcher !== null) {
+ this.chunk(node.matcher);
+
+ if (node.value !== null) {
+ this.node(node.value);
+
+ // space between string and flags is not required
+ if (node.value.type === 'String') {
+ flagsPrefix = '';
+ }
+ }
+ }
+
+ if (node.flags !== null) {
+ this.chunk(flagsPrefix);
+ this.chunk(node.flags);
+ }
+
+ this.chunk(']');
+ }
+ };
+
+ var TYPE$e = tokenizer.TYPE;
+ var rawMode$1 = Raw.mode;
+
+ var WHITESPACE$5 = TYPE$e.WhiteSpace;
+ var COMMENT$5 = TYPE$e.Comment;
+ var SEMICOLON$2 = TYPE$e.Semicolon;
+ var ATKEYWORD$1 = TYPE$e.AtKeyword;
+ var LEFTCURLYBRACKET$3 = TYPE$e.LeftCurlyBracket;
+ var RIGHTCURLYBRACKET$2 = TYPE$e.RightCurlyBracket;
+
+ function consumeRaw$1(startToken) {
+ return this.Raw(startToken, null, true);
+ }
+ function consumeRule() {
+ return this.parseWithFallback(this.Rule, consumeRaw$1);
+ }
+ function consumeRawDeclaration(startToken) {
+ return this.Raw(startToken, rawMode$1.semicolonIncluded, true);
+ }
+ function consumeDeclaration() {
+ if (this.scanner.tokenType === SEMICOLON$2) {
+ return consumeRawDeclaration.call(this, this.scanner.tokenIndex);
+ }
+
+ var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
+
+ if (this.scanner.tokenType === SEMICOLON$2) {
+ this.scanner.next();
+ }
+
+ return node;
+ }
+
+ var Block = {
+ name: 'Block',
+ structure: {
+ children: [[
+ 'Atrule',
+ 'Rule',
+ 'Declaration'
+ ]]
+ },
+ parse: function(isDeclaration) {
+ var consumer = isDeclaration ? consumeDeclaration : consumeRule;
+
+ var start = this.scanner.tokenStart;
+ var children = this.createList();
+
+ this.eat(LEFTCURLYBRACKET$3);
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case RIGHTCURLYBRACKET$2:
+ break scan;
+
+ case WHITESPACE$5:
+ case COMMENT$5:
+ this.scanner.next();
+ break;
+
+ case ATKEYWORD$1:
+ children.push(this.parseWithFallback(this.Atrule, consumeRaw$1));
+ break;
+
+ default:
+ children.push(consumer.call(this));
+ }
+ }
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTCURLYBRACKET$2);
+ }
+
+ return {
+ type: 'Block',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('{');
+ this.children(node, function(prev) {
+ if (prev.type === 'Declaration') {
+ this.chunk(';');
+ }
+ });
+ this.chunk('}');
+ },
+ walkContext: 'block'
+ };
+
+ var TYPE$f = tokenizer.TYPE;
+
+ var LEFTSQUAREBRACKET$2 = TYPE$f.LeftSquareBracket;
+ var RIGHTSQUAREBRACKET$2 = TYPE$f.RightSquareBracket;
+
+ var Brackets = {
+ name: 'Brackets',
+ structure: {
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var children = null;
+
+ this.eat(LEFTSQUAREBRACKET$2);
+
+ children = readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTSQUAREBRACKET$2);
+ }
+
+ return {
+ type: 'Brackets',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('[');
+ this.children(node);
+ this.chunk(']');
+ }
+ };
+
+ var CDC = tokenizer.TYPE.CDC;
+
+ var CDC_1 = {
+ name: 'CDC',
+ structure: [],
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(CDC); // -->
+
+ return {
+ type: 'CDC',
+ loc: this.getLocation(start, this.scanner.tokenStart)
+ };
+ },
+ generate: function() {
+ this.chunk('-->');
+ }
+ };
+
+ var CDO = tokenizer.TYPE.CDO;
+
+ var CDO_1 = {
+ name: 'CDO',
+ structure: [],
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(CDO); // <!--
+
+ return {
+ type: 'CDO',
+ loc: this.getLocation(start, this.scanner.tokenStart)
+ };
+ },
+ generate: function() {
+ this.chunk('<!--');
+ }
+ };
+
+ var TYPE$g = tokenizer.TYPE;
+
+ var IDENT$5 = TYPE$g.Ident;
+ var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+ // '.' ident
+ var ClassSelector = {
+ name: 'ClassSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ if (!this.scanner.isDelim(FULLSTOP)) {
+ this.error('Full stop is expected');
+ }
+
+ this.scanner.next();
+
+ return {
+ type: 'ClassSelector',
+ loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),
+ name: this.consume(IDENT$5)
+ };
+ },
+ generate: function(node) {
+ this.chunk('.');
+ this.chunk(node.name);
+ }
+ };
+
+ var TYPE$h = tokenizer.TYPE;
+
+ var IDENT$6 = TYPE$h.Ident;
+ var PLUSSIGN$4 = 0x002B; // U+002B PLUS SIGN (+)
+ var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+ var GREATERTHANSIGN$1 = 0x003E; // U+003E GREATER-THAN SIGN (>)
+ var TILDE$1 = 0x007E; // U+007E TILDE (~)
+
+ // + | > | ~ | /deep/
+ var Combinator = {
+ name: 'Combinator',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ switch (code) {
+ case GREATERTHANSIGN$1:
+ case PLUSSIGN$4:
+ case TILDE$1:
+ this.scanner.next();
+ break;
+
+ case SOLIDUS:
+ this.scanner.next();
+
+ if (this.scanner.tokenType !== IDENT$6 || this.scanner.lookupValue(0, 'deep') === false) {
+ this.error('Identifier `deep` is expected');
+ }
+
+ this.scanner.next();
+
+ if (!this.scanner.isDelim(SOLIDUS)) {
+ this.error('Solidus is expected');
+ }
+
+ this.scanner.next();
+ break;
+
+ default:
+ this.error('Combinator is expected');
+ }
+
+ return {
+ type: 'Combinator',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+ };
+
+ var TYPE$i = tokenizer.TYPE;
+
+ var COMMENT$6 = TYPE$i.Comment;
+ var ASTERISK$2 = 0x002A; // U+002A ASTERISK (*)
+ var SOLIDUS$1 = 0x002F; // U+002F SOLIDUS (/)
+
+ // '/*' .* '*/'
+ var Comment = {
+ name: 'Comment',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var end = this.scanner.tokenEnd;
+
+ this.eat(COMMENT$6);
+
+ if ((end - start + 2) >= 2 &&
+ this.scanner.source.charCodeAt(end - 2) === ASTERISK$2 &&
+ this.scanner.source.charCodeAt(end - 1) === SOLIDUS$1) {
+ end -= 2;
+ }
+
+ return {
+ type: 'Comment',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start + 2, end)
+ };
+ },
+ generate: function(node) {
+ this.chunk('/*');
+ this.chunk(node.value);
+ this.chunk('*/');
+ }
+ };
+
+ var isCustomProperty$1 = names.isCustomProperty;
+ var TYPE$j = tokenizer.TYPE;
+ var rawMode$2 = Raw.mode;
+
+ var IDENT$7 = TYPE$j.Ident;
+ var HASH$1 = TYPE$j.Hash;
+ var COLON$1 = TYPE$j.Colon;
+ var SEMICOLON$3 = TYPE$j.Semicolon;
+ var DELIM$2 = TYPE$j.Delim;
+ var WHITESPACE$6 = TYPE$j.WhiteSpace;
+ var EXCLAMATIONMARK$2 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+ var NUMBERSIGN$2 = 0x0023; // U+0023 NUMBER SIGN (#)
+ var DOLLARSIGN$1 = 0x0024; // U+0024 DOLLAR SIGN ($)
+ var AMPERSAND$1 = 0x0026; // U+0026 ANPERSAND (&)
+ var ASTERISK$3 = 0x002A; // U+002A ASTERISK (*)
+ var PLUSSIGN$5 = 0x002B; // U+002B PLUS SIGN (+)
+ var SOLIDUS$2 = 0x002F; // U+002F SOLIDUS (/)
+
+ function consumeValueRaw(startToken) {
+ return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, true);
+ }
+
+ function consumeCustomPropertyRaw(startToken) {
+ return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, false);
+ }
+
+ function consumeValue() {
+ var startValueToken = this.scanner.tokenIndex;
+ var value = this.Value();
+
+ if (value.type !== 'Raw' &&
+ this.scanner.eof === false &&
+ this.scanner.tokenType !== SEMICOLON$3 &&
+ this.scanner.isDelim(EXCLAMATIONMARK$2) === false &&
+ this.scanner.isBalanceEdge(startValueToken) === false) {
+ this.error();
+ }
+
+ return value;
+ }
+
+ var Declaration = {
+ name: 'Declaration',
+ structure: {
+ important: [Boolean, String],
+ property: String,
+ value: ['Value', 'Raw']
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var startToken = this.scanner.tokenIndex;
+ var property = readProperty$1.call(this);
+ var customProperty = isCustomProperty$1(property);
+ var parseValue = customProperty ? this.parseCustomProperty : this.parseValue;
+ var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;
+ var important = false;
+ var value;
+
+ this.scanner.skipSC();
+ this.eat(COLON$1);
+
+ const valueStart = this.scanner.tokenIndex;
+
+ if (!customProperty) {
+ this.scanner.skipSC();
+ }
+
+ if (parseValue) {
+ value = this.parseWithFallback(consumeValue, consumeRaw);
+ } else {
+ value = consumeRaw.call(this, this.scanner.tokenIndex);
+ }
+
+ if (customProperty && value.type === 'Value' && value.children.isEmpty()) {
+ for (let offset = valueStart - this.scanner.tokenIndex; offset <= 0; offset++) {
+ if (this.scanner.lookupType(offset) === WHITESPACE$6) {
+ value.children.appendData({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+ });
+ break;
+ }
+ }
+ }
+
+ if (this.scanner.isDelim(EXCLAMATIONMARK$2)) {
+ important = getImportant.call(this);
+ this.scanner.skipSC();
+ }
+
+ // Do not include semicolon to range per spec
+ // https://drafts.csswg.org/css-syntax/#declaration-diagram
+
+ if (this.scanner.eof === false &&
+ this.scanner.tokenType !== SEMICOLON$3 &&
+ this.scanner.isBalanceEdge(startToken) === false) {
+ this.error();
+ }
+
+ return {
+ type: 'Declaration',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ important: important,
+ property: property,
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.property);
+ this.chunk(':');
+ this.node(node.value);
+
+ if (node.important) {
+ this.chunk(node.important === true ? '!important' : '!' + node.important);
+ }
+ },
+ walkContext: 'declaration'
+ };
+
+ function readProperty$1() {
+ var start = this.scanner.tokenStart;
+
+ // hacks
+ if (this.scanner.tokenType === DELIM$2) {
+ switch (this.scanner.source.charCodeAt(this.scanner.tokenStart)) {
+ case ASTERISK$3:
+ case DOLLARSIGN$1:
+ case PLUSSIGN$5:
+ case NUMBERSIGN$2:
+ case AMPERSAND$1:
+ this.scanner.next();
+ break;
+
+ // TODO: not sure we should support this hack
+ case SOLIDUS$2:
+ this.scanner.next();
+ if (this.scanner.isDelim(SOLIDUS$2)) {
+ this.scanner.next();
+ }
+ break;
+ }
+ }
+
+ if (this.scanner.tokenType === HASH$1) {
+ this.eat(HASH$1);
+ } else {
+ this.eat(IDENT$7);
+ }
+
+ return this.scanner.substrToCursor(start);
+ }
+
+ // ! ws* important
+ function getImportant() {
+ this.eat(DELIM$2);
+ this.scanner.skipSC();
+
+ var important = this.consume(IDENT$7);
+
+ // store original value in case it differ from `important`
+ // for better original source restoring and hacks like `!ie` support
+ return important === 'important' ? true : important;
+ }
+
+ var TYPE$k = tokenizer.TYPE;
+ var rawMode$3 = Raw.mode;
+
+ var WHITESPACE$7 = TYPE$k.WhiteSpace;
+ var COMMENT$7 = TYPE$k.Comment;
+ var SEMICOLON$4 = TYPE$k.Semicolon;
+
+ function consumeRaw$2(startToken) {
+ return this.Raw(startToken, rawMode$3.semicolonIncluded, true);
+ }
+
+ var DeclarationList = {
+ name: 'DeclarationList',
+ structure: {
+ children: [[
+ 'Declaration'
+ ]]
+ },
+ parse: function() {
+ var children = this.createList();
+
+
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE$7:
+ case COMMENT$7:
+ case SEMICOLON$4:
+ this.scanner.next();
+ break;
+
+ default:
+ children.push(this.parseWithFallback(this.Declaration, consumeRaw$2));
+ }
+ }
+
+ return {
+ type: 'DeclarationList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function(prev) {
+ if (prev.type === 'Declaration') {
+ this.chunk(';');
+ }
+ });
+ }
+ };
+
+ var consumeNumber$3 = utils.consumeNumber;
+ var TYPE$l = tokenizer.TYPE;
+
+ var DIMENSION$3 = TYPE$l.Dimension;
+
+ var Dimension = {
+ name: 'Dimension',
+ structure: {
+ value: String,
+ unit: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var numberEnd = consumeNumber$3(this.scanner.source, start);
+
+ this.eat(DIMENSION$3);
+
+ return {
+ type: 'Dimension',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start, numberEnd),
+ unit: this.scanner.source.substring(numberEnd, this.scanner.tokenStart)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ this.chunk(node.unit);
+ }
+ };
+
+ var TYPE$m = tokenizer.TYPE;
+
+ var RIGHTPARENTHESIS$2 = TYPE$m.RightParenthesis;
+
+ // <function-token> <sequence> )
+ var _Function = {
+ name: 'Function',
+ structure: {
+ name: String,
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var name = this.consumeFunctionName();
+ var nameLowerCase = name.toLowerCase();
+ var children;
+
+ children = recognizer.hasOwnProperty(nameLowerCase)
+ ? recognizer[nameLowerCase].call(this, recognizer)
+ : readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTPARENTHESIS$2);
+ }
+
+ return {
+ type: 'Function',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ },
+ walkContext: 'function'
+ };
+
+ var TYPE$n = tokenizer.TYPE;
+
+ var HASH$2 = TYPE$n.Hash;
+
+ // '#' ident
+ var Hash = {
+ name: 'Hash',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(HASH$2);
+
+ return {
+ type: 'Hash',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start + 1)
+ };
+ },
+ generate: function(node) {
+ this.chunk('#');
+ this.chunk(node.value);
+ }
+ };
+
+ var TYPE$o = tokenizer.TYPE;
+
+ var IDENT$8 = TYPE$o.Ident;
+
+ var Identifier = {
+ name: 'Identifier',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ return {
+ type: 'Identifier',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ name: this.consume(IDENT$8)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+ };
+
+ var TYPE$p = tokenizer.TYPE;
+
+ var HASH$3 = TYPE$p.Hash;
+
+ // <hash-token>
+ var IdSelector = {
+ name: 'IdSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ // TODO: check value is an ident
+ this.eat(HASH$3);
+
+ return {
+ type: 'IdSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start + 1)
+ };
+ },
+ generate: function(node) {
+ this.chunk('#');
+ this.chunk(node.name);
+ }
+ };
+
+ var TYPE$q = tokenizer.TYPE;
+
+ var IDENT$9 = TYPE$q.Ident;
+ var NUMBER$4 = TYPE$q.Number;
+ var DIMENSION$4 = TYPE$q.Dimension;
+ var LEFTPARENTHESIS$2 = TYPE$q.LeftParenthesis;
+ var RIGHTPARENTHESIS$3 = TYPE$q.RightParenthesis;
+ var COLON$2 = TYPE$q.Colon;
+ var DELIM$3 = TYPE$q.Delim;
+
+ var MediaFeature = {
+ name: 'MediaFeature',
+ structure: {
+ name: String,
+ value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var value = null;
+
+ this.eat(LEFTPARENTHESIS$2);
+ this.scanner.skipSC();
+
+ name = this.consume(IDENT$9);
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType !== RIGHTPARENTHESIS$3) {
+ this.eat(COLON$2);
+ this.scanner.skipSC();
+
+ switch (this.scanner.tokenType) {
+ case NUMBER$4:
+ if (this.lookupNonWSType(1) === DELIM$3) {
+ value = this.Ratio();
+ } else {
+ value = this.Number();
+ }
+
+ break;
+
+ case DIMENSION$4:
+ value = this.Dimension();
+ break;
+
+ case IDENT$9:
+ value = this.Identifier();
+
+ break;
+
+ default:
+ this.error('Number, dimension, ratio or identifier is expected');
+ }
+
+ this.scanner.skipSC();
+ }
+
+ this.eat(RIGHTPARENTHESIS$3);
+
+ return {
+ type: 'MediaFeature',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk('(');
+ this.chunk(node.name);
+ if (node.value !== null) {
+ this.chunk(':');
+ this.node(node.value);
+ }
+ this.chunk(')');
+ }
+ };
+
+ var TYPE$r = tokenizer.TYPE;
+
+ var WHITESPACE$8 = TYPE$r.WhiteSpace;
+ var COMMENT$8 = TYPE$r.Comment;
+ var IDENT$a = TYPE$r.Ident;
+ var LEFTPARENTHESIS$3 = TYPE$r.LeftParenthesis;
+
+ var MediaQuery = {
+ name: 'MediaQuery',
+ structure: {
+ children: [[
+ 'Identifier',
+ 'MediaFeature',
+ 'WhiteSpace'
+ ]]
+ },
+ parse: function() {
+ this.scanner.skipSC();
+
+ var children = this.createList();
+ var child = null;
+ var space = null;
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case COMMENT$8:
+ this.scanner.next();
+ continue;
+
+ case WHITESPACE$8:
+ space = this.WhiteSpace();
+ continue;
+
+ case IDENT$a:
+ child = this.Identifier();
+ break;
+
+ case LEFTPARENTHESIS$3:
+ child = this.MediaFeature();
+ break;
+
+ default:
+ break scan;
+ }
+
+ if (space !== null) {
+ children.push(space);
+ space = null;
+ }
+
+ children.push(child);
+ }
+
+ if (child === null) {
+ this.error('Identifier or parenthesis is expected');
+ }
+
+ return {
+ type: 'MediaQuery',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+ };
+
+ var COMMA$1 = tokenizer.TYPE.Comma;
+
+ var MediaQueryList = {
+ name: 'MediaQueryList',
+ structure: {
+ children: [[
+ 'MediaQuery'
+ ]]
+ },
+ parse: function(relative) {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ while (!this.scanner.eof) {
+ children.push(this.MediaQuery(relative));
+
+ if (this.scanner.tokenType !== COMMA$1) {
+ break;
+ }
+
+ this.scanner.next();
+ }
+
+ return {
+ type: 'MediaQueryList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function() {
+ this.chunk(',');
+ });
+ }
+ };
+
+ var Nth = {
+ name: 'Nth',
+ structure: {
+ nth: ['AnPlusB', 'Identifier'],
+ selector: ['SelectorList', null]
+ },
+ parse: function(allowOfClause) {
+ this.scanner.skipSC();
+
+ var start = this.scanner.tokenStart;
+ var end = start;
+ var selector = null;
+ var query;
+
+ if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {
+ query = this.Identifier();
+ } else {
+ query = this.AnPlusB();
+ }
+
+ this.scanner.skipSC();
+
+ if (allowOfClause && this.scanner.lookupValue(0, 'of')) {
+ this.scanner.next();
+
+ selector = this.SelectorList();
+
+ if (this.needPositions) {
+ end = this.getLastListNode(selector.children).loc.end.offset;
+ }
+ } else {
+ if (this.needPositions) {
+ end = query.loc.end.offset;
+ }
+ }
+
+ return {
+ type: 'Nth',
+ loc: this.getLocation(start, end),
+ nth: query,
+ selector: selector
+ };
+ },
+ generate: function(node) {
+ this.node(node.nth);
+ if (node.selector !== null) {
+ this.chunk(' of ');
+ this.node(node.selector);
+ }
+ }
+ };
+
+ var NUMBER$5 = tokenizer.TYPE.Number;
+
+ var _Number = {
+ name: 'Number',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ return {
+ type: 'Number',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ value: this.consume(NUMBER$5)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+ };
+
+ // '/' | '*' | ',' | ':' | '+' | '-'
+ var Operator = {
+ name: 'Operator',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.scanner.next();
+
+ return {
+ type: 'Operator',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+ };
+
+ var TYPE$s = tokenizer.TYPE;
+
+ var LEFTPARENTHESIS$4 = TYPE$s.LeftParenthesis;
+ var RIGHTPARENTHESIS$4 = TYPE$s.RightParenthesis;
+
+ var Parentheses = {
+ name: 'Parentheses',
+ structure: {
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var children = null;
+
+ this.eat(LEFTPARENTHESIS$4);
+
+ children = readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTPARENTHESIS$4);
+ }
+
+ return {
+ type: 'Parentheses',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+ };
+
+ var consumeNumber$4 = utils.consumeNumber;
+ var TYPE$t = tokenizer.TYPE;
+
+ var PERCENTAGE$1 = TYPE$t.Percentage;
+
+ var Percentage = {
+ name: 'Percentage',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var numberEnd = consumeNumber$4(this.scanner.source, start);
+
+ this.eat(PERCENTAGE$1);
+
+ return {
+ type: 'Percentage',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start, numberEnd)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ this.chunk('%');
+ }
+ };
+
+ var TYPE$u = tokenizer.TYPE;
+
+ var IDENT$b = TYPE$u.Ident;
+ var FUNCTION$1 = TYPE$u.Function;
+ var COLON$3 = TYPE$u.Colon;
+ var RIGHTPARENTHESIS$5 = TYPE$u.RightParenthesis;
+
+ // : [ <ident> | <function-token> <any-value>? ) ]
+ var PseudoClassSelector = {
+ name: 'PseudoClassSelector',
+ structure: {
+ name: String,
+ children: [['Raw'], null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = null;
+ var name;
+ var nameLowerCase;
+
+ this.eat(COLON$3);
+
+ if (this.scanner.tokenType === FUNCTION$1) {
+ name = this.consumeFunctionName();
+ nameLowerCase = name.toLowerCase();
+
+ if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+ this.scanner.skipSC();
+ children = this.pseudo[nameLowerCase].call(this);
+ this.scanner.skipSC();
+ } else {
+ children = this.createList();
+ children.push(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ }
+
+ this.eat(RIGHTPARENTHESIS$5);
+ } else {
+ name = this.consume(IDENT$b);
+ }
+
+ return {
+ type: 'PseudoClassSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk(':');
+ this.chunk(node.name);
+
+ if (node.children !== null) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+ },
+ walkContext: 'function'
+ };
+
+ var TYPE$v = tokenizer.TYPE;
+
+ var IDENT$c = TYPE$v.Ident;
+ var FUNCTION$2 = TYPE$v.Function;
+ var COLON$4 = TYPE$v.Colon;
+ var RIGHTPARENTHESIS$6 = TYPE$v.RightParenthesis;
+
+ // :: [ <ident> | <function-token> <any-value>? ) ]
+ var PseudoElementSelector = {
+ name: 'PseudoElementSelector',
+ structure: {
+ name: String,
+ children: [['Raw'], null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = null;
+ var name;
+ var nameLowerCase;
+
+ this.eat(COLON$4);
+ this.eat(COLON$4);
+
+ if (this.scanner.tokenType === FUNCTION$2) {
+ name = this.consumeFunctionName();
+ nameLowerCase = name.toLowerCase();
+
+ if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+ this.scanner.skipSC();
+ children = this.pseudo[nameLowerCase].call(this);
+ this.scanner.skipSC();
+ } else {
+ children = this.createList();
+ children.push(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ }
+
+ this.eat(RIGHTPARENTHESIS$6);
+ } else {
+ name = this.consume(IDENT$c);
+ }
+
+ return {
+ type: 'PseudoElementSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('::');
+ this.chunk(node.name);
+
+ if (node.children !== null) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+ },
+ walkContext: 'function'
+ };
+
+ var isDigit$5 = tokenizer.isDigit;
+ var TYPE$w = tokenizer.TYPE;
+
+ var NUMBER$6 = TYPE$w.Number;
+ var DELIM$4 = TYPE$w.Delim;
+ var SOLIDUS$3 = 0x002F; // U+002F SOLIDUS (/)
+ var FULLSTOP$1 = 0x002E; // U+002E FULL STOP (.)
+
+ // Terms of <ratio> should be a positive numbers (not zero or negative)
+ // (see https://drafts.csswg.org/mediaqueries-3/#values)
+ // However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
+ // and this is using by various sites. Therefore we relax checking on parse
+ // to test a term is unsigned number without an exponent part.
+ // Additional checking may be applied on lexer validation.
+ function consumeNumber$5() {
+ this.scanner.skipWS();
+
+ var value = this.consume(NUMBER$6);
+
+ for (var i = 0; i < value.length; i++) {
+ var code = value.charCodeAt(i);
+ if (!isDigit$5(code) && code !== FULLSTOP$1) {
+ this.error('Unsigned number is expected', this.scanner.tokenStart - value.length + i);
+ }
+ }
+
+ if (Number(value) === 0) {
+ this.error('Zero number is not allowed', this.scanner.tokenStart - value.length);
+ }
+
+ return value;
+ }
+
+ // <positive-integer> S* '/' S* <positive-integer>
+ var Ratio = {
+ name: 'Ratio',
+ structure: {
+ left: String,
+ right: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var left = consumeNumber$5.call(this);
+ var right;
+
+ this.scanner.skipWS();
+
+ if (!this.scanner.isDelim(SOLIDUS$3)) {
+ this.error('Solidus is expected');
+ }
+ this.eat(DELIM$4);
+ right = consumeNumber$5.call(this);
+
+ return {
+ type: 'Ratio',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ left: left,
+ right: right
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.left);
+ this.chunk('/');
+ this.chunk(node.right);
+ }
+ };
+
+ var TYPE$x = tokenizer.TYPE;
+ var rawMode$4 = Raw.mode;
+
+ var LEFTCURLYBRACKET$4 = TYPE$x.LeftCurlyBracket;
+
+ function consumeRaw$3(startToken) {
+ return this.Raw(startToken, rawMode$4.leftCurlyBracket, true);
+ }
+
+ function consumePrelude() {
+ var prelude = this.SelectorList();
+
+ if (prelude.type !== 'Raw' &&
+ this.scanner.eof === false &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET$4) {
+ this.error();
+ }
+
+ return prelude;
+ }
+
+ var Rule = {
+ name: 'Rule',
+ structure: {
+ prelude: ['SelectorList', 'Raw'],
+ block: ['Block']
+ },
+ parse: function() {
+ var startToken = this.scanner.tokenIndex;
+ var startOffset = this.scanner.tokenStart;
+ var prelude;
+ var block;
+
+ if (this.parseRulePrelude) {
+ prelude = this.parseWithFallback(consumePrelude, consumeRaw$3);
+ } else {
+ prelude = consumeRaw$3.call(this, startToken);
+ }
+
+ block = this.Block(true);
+
+ return {
+ type: 'Rule',
+ loc: this.getLocation(startOffset, this.scanner.tokenStart),
+ prelude: prelude,
+ block: block
+ };
+ },
+ generate: function(node) {
+ this.node(node.prelude);
+ this.node(node.block);
+ },
+ walkContext: 'rule'
+ };
+
+ var Selector = {
+ name: 'Selector',
+ structure: {
+ children: [[
+ 'TypeSelector',
+ 'IdSelector',
+ 'ClassSelector',
+ 'AttributeSelector',
+ 'PseudoClassSelector',
+ 'PseudoElementSelector',
+ 'Combinator',
+ 'WhiteSpace'
+ ]]
+ },
+ parse: function() {
+ var children = this.readSequence(this.scope.Selector);
+
+ // nothing were consumed
+ if (this.getFirstListNode(children) === null) {
+ this.error('Selector is expected');
+ }
+
+ return {
+ type: 'Selector',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+ };
+
+ var TYPE$y = tokenizer.TYPE;
+
+ var COMMA$2 = TYPE$y.Comma;
+
+ var SelectorList = {
+ name: 'SelectorList',
+ structure: {
+ children: [[
+ 'Selector',
+ 'Raw'
+ ]]
+ },
+ parse: function() {
+ var children = this.createList();
+
+ while (!this.scanner.eof) {
+ children.push(this.Selector());
+
+ if (this.scanner.tokenType === COMMA$2) {
+ this.scanner.next();
+ continue;
+ }
+
+ break;
+ }
+
+ return {
+ type: 'SelectorList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function() {
+ this.chunk(',');
+ });
+ },
+ walkContext: 'selector'
+ };
+
+ var STRING$1 = tokenizer.TYPE.String;
+
+ var _String = {
+ name: 'String',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ return {
+ type: 'String',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ value: this.consume(STRING$1)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+ };
+
+ var TYPE$z = tokenizer.TYPE;
+
+ var WHITESPACE$9 = TYPE$z.WhiteSpace;
+ var COMMENT$9 = TYPE$z.Comment;
+ var ATKEYWORD$2 = TYPE$z.AtKeyword;
+ var CDO$1 = TYPE$z.CDO;
+ var CDC$1 = TYPE$z.CDC;
+ var EXCLAMATIONMARK$3 = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+ function consumeRaw$4(startToken) {
+ return this.Raw(startToken, null, false);
+ }
+
+ var StyleSheet = {
+ name: 'StyleSheet',
+ structure: {
+ children: [[
+ 'Comment',
+ 'CDO',
+ 'CDC',
+ 'Atrule',
+ 'Rule',
+ 'Raw'
+ ]]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = this.createList();
+ var child;
+
+
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE$9:
+ this.scanner.next();
+ continue;
+
+ case COMMENT$9:
+ // ignore comments except exclamation comments (i.e. /*! .. */) on top level
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK$3) {
+ this.scanner.next();
+ continue;
+ }
+
+ child = this.Comment();
+ break;
+
+ case CDO$1: // <!--
+ child = this.CDO();
+ break;
+
+ case CDC$1: // -->
+ child = this.CDC();
+ break;
+
+ // CSS Syntax Module Level 3
+ // §2.2 Error handling
+ // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
+ case ATKEYWORD$2:
+ child = this.parseWithFallback(this.Atrule, consumeRaw$4);
+ break;
+
+ // Anything else starts a qualified rule ...
+ default:
+ child = this.parseWithFallback(this.Rule, consumeRaw$4);
+ }
+
+ children.push(child);
+ }
+
+ return {
+ type: 'StyleSheet',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ },
+ walkContext: 'stylesheet'
+ };
+
+ var TYPE$A = tokenizer.TYPE;
+
+ var IDENT$d = TYPE$A.Ident;
+ var ASTERISK$4 = 0x002A; // U+002A ASTERISK (*)
+ var VERTICALLINE$2 = 0x007C; // U+007C VERTICAL LINE (|)
+
+ function eatIdentifierOrAsterisk() {
+ if (this.scanner.tokenType !== IDENT$d &&
+ this.scanner.isDelim(ASTERISK$4) === false) {
+ this.error('Identifier or asterisk is expected');
+ }
+
+ this.scanner.next();
+ }
+
+ // ident
+ // ident|ident
+ // ident|*
+ // *
+ // *|ident
+ // *|*
+ // |ident
+ // |*
+ var TypeSelector = {
+ name: 'TypeSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ if (this.scanner.isDelim(VERTICALLINE$2)) {
+ this.scanner.next();
+ eatIdentifierOrAsterisk.call(this);
+ } else {
+ eatIdentifierOrAsterisk.call(this);
+
+ if (this.scanner.isDelim(VERTICALLINE$2)) {
+ this.scanner.next();
+ eatIdentifierOrAsterisk.call(this);
+ }
+ }
+
+ return {
+ type: 'TypeSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+ };
+
+ var isHexDigit$4 = tokenizer.isHexDigit;
+ var cmpChar$4 = tokenizer.cmpChar;
+ var TYPE$B = tokenizer.TYPE;
+ var NAME$3 = tokenizer.NAME;
+
+ var IDENT$e = TYPE$B.Ident;
+ var NUMBER$7 = TYPE$B.Number;
+ var DIMENSION$5 = TYPE$B.Dimension;
+ var PLUSSIGN$6 = 0x002B; // U+002B PLUS SIGN (+)
+ var HYPHENMINUS$4 = 0x002D; // U+002D HYPHEN-MINUS (-)
+ var QUESTIONMARK$2 = 0x003F; // U+003F QUESTION MARK (?)
+ var U$1 = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+ function eatHexSequence(offset, allowDash) {
+ for (var pos = this.scanner.tokenStart + offset, len = 0; pos < this.scanner.tokenEnd; pos++) {
+ var code = this.scanner.source.charCodeAt(pos);
+
+ if (code === HYPHENMINUS$4 && allowDash && len !== 0) {
+ if (eatHexSequence.call(this, offset + len + 1, false) === 0) {
+ this.error();
+ }
+
+ return -1;
+ }
+
+ if (!isHexDigit$4(code)) {
+ this.error(
+ allowDash && len !== 0
+ ? 'HyphenMinus' + (len < 6 ? ' or hex digit' : '') + ' is expected'
+ : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),
+ pos
+ );
+ }
+
+ if (++len > 6) {
+ this.error('Too many hex digits', pos);
+ } }
+
+ this.scanner.next();
+ return len;
+ }
+
+ function eatQuestionMarkSequence(max) {
+ var count = 0;
+
+ while (this.scanner.isDelim(QUESTIONMARK$2)) {
+ if (++count > max) {
+ this.error('Too many question marks');
+ }
+
+ this.scanner.next();
+ }
+ }
+
+ function startsWith$1(code) {
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== code) {
+ this.error(NAME$3[code] + ' is expected');
+ }
+ }
+
+ // https://drafts.csswg.org/css-syntax/#urange
+ // Informally, the <urange> production has three forms:
+ // U+0001
+ // Defines a range consisting of a single code point, in this case the code point "1".
+ // U+0001-00ff
+ // Defines a range of codepoints between the first and the second value, in this case
+ // the range between "1" and "ff" (255 in decimal) inclusive.
+ // U+00??
+ // Defines a range of codepoints where the "?" characters range over all hex digits,
+ // in this case defining the same as the value U+0000-00ff.
+ // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+ //
+ // <urange> =
+ // u '+' <ident-token> '?'* |
+ // u <dimension-token> '?'* |
+ // u <number-token> '?'* |
+ // u <number-token> <dimension-token> |
+ // u <number-token> <number-token> |
+ // u '+' '?'+
+ function scanUnicodeRange() {
+ var hexLength = 0;
+
+ // u '+' <ident-token> '?'*
+ // u '+' '?'+
+ if (this.scanner.isDelim(PLUSSIGN$6)) {
+ this.scanner.next();
+
+ if (this.scanner.tokenType === IDENT$e) {
+ hexLength = eatHexSequence.call(this, 0, true);
+ if (hexLength > 0) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ }
+ return;
+ }
+
+ if (this.scanner.isDelim(QUESTIONMARK$2)) {
+ this.scanner.next();
+ eatQuestionMarkSequence.call(this, 5);
+ return;
+ }
+
+ this.error('Hex digit or question mark is expected');
+ return;
+ }
+
+ // u <number-token> '?'*
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (this.scanner.tokenType === NUMBER$7) {
+ startsWith$1.call(this, PLUSSIGN$6);
+ hexLength = eatHexSequence.call(this, 1, true);
+
+ if (this.scanner.isDelim(QUESTIONMARK$2)) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ return;
+ }
+
+ if (this.scanner.tokenType === DIMENSION$5 ||
+ this.scanner.tokenType === NUMBER$7) {
+ startsWith$1.call(this, HYPHENMINUS$4);
+ eatHexSequence.call(this, 1, false);
+ return;
+ }
+
+ return;
+ }
+
+ // u <dimension-token> '?'*
+ if (this.scanner.tokenType === DIMENSION$5) {
+ startsWith$1.call(this, PLUSSIGN$6);
+ hexLength = eatHexSequence.call(this, 1, true);
+
+ if (hexLength > 0) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ }
+
+ return;
+ }
+
+ this.error();
+ }
+
+ var UnicodeRange = {
+ name: 'UnicodeRange',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ // U or u
+ if (!cmpChar$4(this.scanner.source, start, U$1)) {
+ this.error('U is expected');
+ }
+
+ if (!cmpChar$4(this.scanner.source, start + 1, PLUSSIGN$6)) {
+ this.error('Plus sign is expected');
+ }
+
+ this.scanner.next();
+ scanUnicodeRange.call(this);
+
+ return {
+ type: 'UnicodeRange',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+ };
+
+ var isWhiteSpace$2 = tokenizer.isWhiteSpace;
+ var cmpStr$5 = tokenizer.cmpStr;
+ var TYPE$C = tokenizer.TYPE;
+
+ var FUNCTION$3 = TYPE$C.Function;
+ var URL$1 = TYPE$C.Url;
+ var RIGHTPARENTHESIS$7 = TYPE$C.RightParenthesis;
+
+ // <url-token> | <function-token> <string> )
+ var Url = {
+ name: 'Url',
+ structure: {
+ value: ['String', 'Raw']
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var value;
+
+ switch (this.scanner.tokenType) {
+ case URL$1:
+ var rawStart = start + 4;
+ var rawEnd = this.scanner.tokenEnd - 1;
+
+ while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawStart))) {
+ rawStart++;
+ }
+
+ while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawEnd - 1))) {
+ rawEnd--;
+ }
+
+ value = {
+ type: 'Raw',
+ loc: this.getLocation(rawStart, rawEnd),
+ value: this.scanner.source.substring(rawStart, rawEnd)
+ };
+
+ this.eat(URL$1);
+ break;
+
+ case FUNCTION$3:
+ if (!cmpStr$5(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')) {
+ this.error('Function name must be `url`');
+ }
+
+ this.eat(FUNCTION$3);
+ this.scanner.skipSC();
+ value = this.String();
+ this.scanner.skipSC();
+ this.eat(RIGHTPARENTHESIS$7);
+ break;
+
+ default:
+ this.error('Url or Function is expected');
+ }
+
+ return {
+ type: 'Url',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk('url');
+ this.chunk('(');
+ this.node(node.value);
+ this.chunk(')');
+ }
+ };
+
+ var Value = {
+ name: 'Value',
+ structure: {
+ children: [[]]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = this.readSequence(this.scope.Value);
+
+ return {
+ type: 'Value',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+ };
+
+ var WHITESPACE$a = tokenizer.TYPE.WhiteSpace;
+ var SPACE$2 = Object.freeze({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+ });
+
+ var WhiteSpace$1 = {
+ name: 'WhiteSpace',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ this.eat(WHITESPACE$a);
+ return SPACE$2;
+
+ // return {
+ // type: 'WhiteSpace',
+ // loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ // value: this.consume(WHITESPACE)
+ // };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+ };
+
+ var node = {
+ AnPlusB: AnPlusB,
+ Atrule: Atrule,
+ AtrulePrelude: AtrulePrelude,
+ AttributeSelector: AttributeSelector,
+ Block: Block,
+ Brackets: Brackets,
+ CDC: CDC_1,
+ CDO: CDO_1,
+ ClassSelector: ClassSelector,
+ Combinator: Combinator,
+ Comment: Comment,
+ Declaration: Declaration,
+ DeclarationList: DeclarationList,
+ Dimension: Dimension,
+ Function: _Function,
+ Hash: Hash,
+ Identifier: Identifier,
+ IdSelector: IdSelector,
+ MediaFeature: MediaFeature,
+ MediaQuery: MediaQuery,
+ MediaQueryList: MediaQueryList,
+ Nth: Nth,
+ Number: _Number,
+ Operator: Operator,
+ Parentheses: Parentheses,
+ Percentage: Percentage,
+ PseudoClassSelector: PseudoClassSelector,
+ PseudoElementSelector: PseudoElementSelector,
+ Ratio: Ratio,
+ Raw: Raw,
+ Rule: Rule,
+ Selector: Selector,
+ SelectorList: SelectorList,
+ String: _String,
+ StyleSheet: StyleSheet,
+ TypeSelector: TypeSelector,
+ UnicodeRange: UnicodeRange,
+ Url: Url,
+ Value: Value,
+ WhiteSpace: WhiteSpace$1
+ };
+
+ var lexer = {
+ generic: true,
+ types: data.types,
+ atrules: data.atrules,
+ properties: data.properties,
+ node: node
+ };
+
+ var cmpChar$5 = tokenizer.cmpChar;
+ var cmpStr$6 = tokenizer.cmpStr;
+ var TYPE$D = tokenizer.TYPE;
+
+ var IDENT$f = TYPE$D.Ident;
+ var STRING$2 = TYPE$D.String;
+ var NUMBER$8 = TYPE$D.Number;
+ var FUNCTION$4 = TYPE$D.Function;
+ var URL$2 = TYPE$D.Url;
+ var HASH$4 = TYPE$D.Hash;
+ var DIMENSION$6 = TYPE$D.Dimension;
+ var PERCENTAGE$2 = TYPE$D.Percentage;
+ var LEFTPARENTHESIS$5 = TYPE$D.LeftParenthesis;
+ var LEFTSQUAREBRACKET$3 = TYPE$D.LeftSquareBracket;
+ var COMMA$3 = TYPE$D.Comma;
+ var DELIM$5 = TYPE$D.Delim;
+ var NUMBERSIGN$3 = 0x0023; // U+0023 NUMBER SIGN (#)
+ var ASTERISK$5 = 0x002A; // U+002A ASTERISK (*)
+ var PLUSSIGN$7 = 0x002B; // U+002B PLUS SIGN (+)
+ var HYPHENMINUS$5 = 0x002D; // U+002D HYPHEN-MINUS (-)
+ var SOLIDUS$4 = 0x002F; // U+002F SOLIDUS (/)
+ var U$2 = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+ var _default = function defaultRecognizer(context) {
+ switch (this.scanner.tokenType) {
+ case HASH$4:
+ return this.Hash();
+
+ case COMMA$3:
+ context.space = null;
+ context.ignoreWSAfter = true;
+ return this.Operator();
+
+ case LEFTPARENTHESIS$5:
+ return this.Parentheses(this.readSequence, context.recognizer);
+
+ case LEFTSQUAREBRACKET$3:
+ return this.Brackets(this.readSequence, context.recognizer);
+
+ case STRING$2:
+ return this.String();
+
+ case DIMENSION$6:
+ return this.Dimension();
+
+ case PERCENTAGE$2:
+ return this.Percentage();
+
+ case NUMBER$8:
+ return this.Number();
+
+ case FUNCTION$4:
+ return cmpStr$6(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')
+ ? this.Url()
+ : this.Function(this.readSequence, context.recognizer);
+
+ case URL$2:
+ return this.Url();
+
+ case IDENT$f:
+ // check for unicode range, it should start with u+ or U+
+ if (cmpChar$5(this.scanner.source, this.scanner.tokenStart, U$2) &&
+ cmpChar$5(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN$7)) {
+ return this.UnicodeRange();
+ } else {
+ return this.Identifier();
+ }
+
+ case DELIM$5:
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ if (code === SOLIDUS$4 ||
+ code === ASTERISK$5 ||
+ code === PLUSSIGN$7 ||
+ code === HYPHENMINUS$5) {
+ return this.Operator(); // TODO: replace with Delim
+ }
+
+ // TODO: produce a node with Delim node type
+
+ if (code === NUMBERSIGN$3) {
+ this.error('Hex or identifier is expected', this.scanner.tokenStart + 1);
+ }
+
+ break;
+ }
+ };
+
+ var atrulePrelude = {
+ getNode: _default
+ };
+
+ var TYPE$E = tokenizer.TYPE;
+
+ var DELIM$6 = TYPE$E.Delim;
+ var IDENT$g = TYPE$E.Ident;
+ var DIMENSION$7 = TYPE$E.Dimension;
+ var PERCENTAGE$3 = TYPE$E.Percentage;
+ var NUMBER$9 = TYPE$E.Number;
+ var HASH$5 = TYPE$E.Hash;
+ var COLON$5 = TYPE$E.Colon;
+ var LEFTSQUAREBRACKET$4 = TYPE$E.LeftSquareBracket;
+ var NUMBERSIGN$4 = 0x0023; // U+0023 NUMBER SIGN (#)
+ var ASTERISK$6 = 0x002A; // U+002A ASTERISK (*)
+ var PLUSSIGN$8 = 0x002B; // U+002B PLUS SIGN (+)
+ var SOLIDUS$5 = 0x002F; // U+002F SOLIDUS (/)
+ var FULLSTOP$2 = 0x002E; // U+002E FULL STOP (.)
+ var GREATERTHANSIGN$2 = 0x003E; // U+003E GREATER-THAN SIGN (>)
+ var VERTICALLINE$3 = 0x007C; // U+007C VERTICAL LINE (|)
+ var TILDE$2 = 0x007E; // U+007E TILDE (~)
+
+ function getNode(context) {
+ switch (this.scanner.tokenType) {
+ case LEFTSQUAREBRACKET$4:
+ return this.AttributeSelector();
+
+ case HASH$5:
+ return this.IdSelector();
+
+ case COLON$5:
+ if (this.scanner.lookupType(1) === COLON$5) {
+ return this.PseudoElementSelector();
+ } else {
+ return this.PseudoClassSelector();
+ }
+
+ case IDENT$g:
+ return this.TypeSelector();
+
+ case NUMBER$9:
+ case PERCENTAGE$3:
+ return this.Percentage();
+
+ case DIMENSION$7:
+ // throws when .123ident
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === FULLSTOP$2) {
+ this.error('Identifier is expected', this.scanner.tokenStart + 1);
+ }
+ break;
+
+ case DELIM$6:
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ switch (code) {
+ case PLUSSIGN$8:
+ case GREATERTHANSIGN$2:
+ case TILDE$2:
+ context.space = null;
+ context.ignoreWSAfter = true;
+ return this.Combinator();
+
+ case SOLIDUS$5: // /deep/
+ return this.Combinator();
+
+ case FULLSTOP$2:
+ return this.ClassSelector();
+
+ case ASTERISK$6:
+ case VERTICALLINE$3:
+ return this.TypeSelector();
+
+ case NUMBERSIGN$4:
+ return this.IdSelector();
+ }
+
+ break;
+ }
+ }
+ var selector = {
+ getNode: getNode
+ };
+
+ // legacy IE function
+ // expression( <any-value> )
+ var expression = function() {
+ return this.createSingleNodeList(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ };
+
+ var TYPE$F = tokenizer.TYPE;
+ var rawMode$5 = Raw.mode;
+
+ var COMMA$4 = TYPE$F.Comma;
+ var WHITESPACE$b = TYPE$F.WhiteSpace;
+
+ // var( <ident> , <value>? )
+ var _var = function() {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ // NOTE: Don't check more than a first argument is an ident, rest checks are for lexer
+ children.push(this.Identifier());
+
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType === COMMA$4) {
+ children.push(this.Operator());
+
+ const startIndex = this.scanner.tokenIndex;
+ const value = this.parseCustomProperty
+ ? this.Value(null)
+ : this.Raw(this.scanner.tokenIndex, rawMode$5.exclamationMarkOrSemicolon, false);
+
+ if (value.type === 'Value' && value.children.isEmpty()) {
+ for (let offset = startIndex - this.scanner.tokenIndex; offset <= 0; offset++) {
+ if (this.scanner.lookupType(offset) === WHITESPACE$b) {
+ value.children.appendData({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+ });
+ break;
+ }
+ }
+ }
+
+ children.push(value);
+ }
+
+ return children;
+ };
+
+ var value = {
+ getNode: _default,
+ 'expression': expression,
+ 'var': _var
+ };
+
+ var scope = {
+ AtrulePrelude: atrulePrelude,
+ Selector: selector,
+ Value: value
+ };
+
+ var fontFace = {
+ parse: {
+ prelude: null,
+ block: function() {
+ return this.Block(true);
+ }
+ }
+ };
+
+ var TYPE$G = tokenizer.TYPE;
+
+ var STRING$3 = TYPE$G.String;
+ var IDENT$h = TYPE$G.Ident;
+ var URL$3 = TYPE$G.Url;
+ var FUNCTION$5 = TYPE$G.Function;
+ var LEFTPARENTHESIS$6 = TYPE$G.LeftParenthesis;
+
+ var _import = {
+ parse: {
+ prelude: function() {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ switch (this.scanner.tokenType) {
+ case STRING$3:
+ children.push(this.String());
+ break;
+
+ case URL$3:
+ case FUNCTION$5:
+ children.push(this.Url());
+ break;
+
+ default:
+ this.error('String or url() is expected');
+ }
+
+ if (this.lookupNonWSType(0) === IDENT$h ||
+ this.lookupNonWSType(0) === LEFTPARENTHESIS$6) {
+ children.push(this.WhiteSpace());
+ children.push(this.MediaQueryList());
+ }
+
+ return children;
+ },
+ block: null
+ }
+ };
+
+ var media = {
+ parse: {
+ prelude: function() {
+ return this.createSingleNodeList(
+ this.MediaQueryList()
+ );
+ },
+ block: function() {
+ return this.Block(false);
+ }
+ }
+ };
+
+ var page = {
+ parse: {
+ prelude: function() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ },
+ block: function() {
+ return this.Block(true);
+ }
+ }
+ };
+
+ var TYPE$H = tokenizer.TYPE;
+
+ var WHITESPACE$c = TYPE$H.WhiteSpace;
+ var COMMENT$a = TYPE$H.Comment;
+ var IDENT$i = TYPE$H.Ident;
+ var FUNCTION$6 = TYPE$H.Function;
+ var COLON$6 = TYPE$H.Colon;
+ var LEFTPARENTHESIS$7 = TYPE$H.LeftParenthesis;
+
+ function consumeRaw$5() {
+ return this.createSingleNodeList(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ }
+
+ function parentheses() {
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType === IDENT$i &&
+ this.lookupNonWSType(1) === COLON$6) {
+ return this.createSingleNodeList(
+ this.Declaration()
+ );
+ }
+
+ return readSequence.call(this);
+ }
+
+ function readSequence() {
+ var children = this.createList();
+ var space = null;
+ var child;
+
+ this.scanner.skipSC();
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE$c:
+ space = this.WhiteSpace();
+ continue;
+
+ case COMMENT$a:
+ this.scanner.next();
+ continue;
+
+ case FUNCTION$6:
+ child = this.Function(consumeRaw$5, this.scope.AtrulePrelude);
+ break;
+
+ case IDENT$i:
+ child = this.Identifier();
+ break;
+
+ case LEFTPARENTHESIS$7:
+ child = this.Parentheses(parentheses, this.scope.AtrulePrelude);
+ break;
+
+ default:
+ break scan;
+ }
+
+ if (space !== null) {
+ children.push(space);
+ space = null;
+ }
+
+ children.push(child);
+ }
+
+ return children;
+ }
+
+ var supports = {
+ parse: {
+ prelude: function() {
+ var children = readSequence.call(this);
+
+ if (this.getFirstListNode(children) === null) {
+ this.error('Condition is expected');
+ }
+
+ return children;
+ },
+ block: function() {
+ return this.Block(false);
+ }
+ }
+ };
+
+ var atrule = {
+ 'font-face': fontFace,
+ 'import': _import,
+ 'media': media,
+ 'page': page,
+ 'supports': supports
+ };
+
+ var dir = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.Identifier()
+ );
+ }
+ };
+
+ var has$1 = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ }
+ };
+
+ var lang = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.Identifier()
+ );
+ }
+ };
+
+ var selectorList = {
+ parse: function selectorList() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ }
+ };
+
+ var matches = selectorList;
+
+ var not = selectorList;
+
+ var ALLOW_OF_CLAUSE = true;
+
+ var nthWithOfClause = {
+ parse: function nthWithOfClause() {
+ return this.createSingleNodeList(
+ this.Nth(ALLOW_OF_CLAUSE)
+ );
+ }
+ };
+
+ var nthChild = nthWithOfClause;
+
+ var nthLastChild = nthWithOfClause;
+
+ var DISALLOW_OF_CLAUSE = false;
+
+ var nth = {
+ parse: function nth() {
+ return this.createSingleNodeList(
+ this.Nth(DISALLOW_OF_CLAUSE)
+ );
+ }
+ };
+
+ var nthLastOfType = nth;
+
+ var nthOfType = nth;
+
+ var slotted = {
+ parse: function compoundSelector() {
+ return this.createSingleNodeList(
+ this.Selector()
+ );
+ }
+ };
+
+ var pseudo = {
+ 'dir': dir,
+ 'has': has$1,
+ 'lang': lang,
+ 'matches': matches,
+ 'not': not,
+ 'nth-child': nthChild,
+ 'nth-last-child': nthLastChild,
+ 'nth-last-of-type': nthLastOfType,
+ 'nth-of-type': nthOfType,
+ 'slotted': slotted
+ };
+
+ var parser = {
+ parseContext: {
+ default: 'StyleSheet',
+ stylesheet: 'StyleSheet',
+ atrule: 'Atrule',
+ atrulePrelude: function(options) {
+ return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);
+ },
+ mediaQueryList: 'MediaQueryList',
+ mediaQuery: 'MediaQuery',
+ rule: 'Rule',
+ selectorList: 'SelectorList',
+ selector: 'Selector',
+ block: function() {
+ return this.Block(true);
+ },
+ declarationList: 'DeclarationList',
+ declaration: 'Declaration',
+ value: 'Value'
+ },
+ scope: scope,
+ atrule: atrule,
+ pseudo: pseudo,
+ node: node
+ };
+
+ var walker = {
+ node: node
+ };
+
+ var version = "1.1.2";
+ var _package = {
+ version: version
+ };
+
+ var _package$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ version: version,
+ 'default': _package
+ });
+
+ var require$$4 = getCjsExportFromNamespace(_package$1);
+
+ function merge() {
+ var dest = {};
+
+ for (var i = 0; i < arguments.length; i++) {
+ var src = arguments[i];
+ for (var key in src) {
+ dest[key] = src[key];
+ }
+ }
+
+ return dest;
+ }
+
+ var syntax = create$4.create(
+ merge(
+ lexer,
+ parser,
+ walker
+ )
+ );
+ var version$1 = require$$4.version;
+ syntax.version = version$1;
+
+ var lib = syntax;
+
+ return lib;
+
+})));
diff --git a/node_modules/csso/node_modules/css-tree/dist/csstree.min.js b/node_modules/csso/node_modules/css-tree/dist/csstree.min.js
new file mode 100644
index 0000000..5c6bfb9
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/dist/csstree.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).csstree=t()}(this,(function(){"use strict";function e(e){return{prev:null,next:null,data:e}}function t(e,t,n){var i;return null!==r?(i=r,r=r.cursor,i.prev=t,i.next=n,i.cursor=e.cursor):i={prev:t,next:n,cursor:e.cursor},e.cursor=i,i}function n(e){var t=e.cursor;e.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=r,r=t}var r=null,i=function(){this.cursor=null,this.head=null,this.tail=null};i.createItem=e,i.prototype.createItem=e,i.prototype.updateCursors=function(e,t,n,r){for(var i=this.cursor;null!==i;)i.prev===e&&(i.prev=t),i.next===n&&(i.next=r),i=i.cursor},i.prototype.getSize=function(){for(var e=0,t=this.head;t;)e++,t=t.next;return e},i.prototype.fromArray=function(t){var n=null;this.head=null;for(var r=0;r<t.length;r++){var i=e(t[r]);null!==n?n.next=i:this.head=i,i.prev=n,n=i}return this.tail=n,this},i.prototype.toArray=function(){for(var e=this.head,t=[];e;)t.push(e.data),e=e.next;return t},i.prototype.toJSON=i.prototype.toArray,i.prototype.isEmpty=function(){return null===this.head},i.prototype.first=function(){return this.head&&this.head.data},i.prototype.last=function(){return this.tail&&this.tail.data},i.prototype.each=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,null,this.head);null!==a.next;)i=a.next,a.next=i.next,e.call(r,i.data,i,this);n(this)},i.prototype.forEach=i.prototype.each,i.prototype.eachRight=function(e,r){var i;void 0===r&&(r=this);for(var a=t(this,this.tail,null);null!==a.prev;)i=a.prev,a.prev=i.prev,e.call(r,i.data,i,this);n(this)},i.prototype.forEachRight=i.prototype.eachRight,i.prototype.reduce=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,null,this.head),s=r;null!==o.next;)a=o.next,o.next=a.next,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.reduceRight=function(e,r,i){var a;void 0===i&&(i=this);for(var o=t(this,this.tail,null),s=r;null!==o.prev;)a=o.prev,o.prev=a.prev,s=e.call(i,s,a.data,a,this);return n(this),s},i.prototype.nextUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,null,e);null!==o.next&&(a=o.next,o.next=a.next,!r.call(i,a.data,a,this)););n(this)}},i.prototype.prevUntil=function(e,r,i){if(null!==e){var a;void 0===i&&(i=this);for(var o=t(this,e,null);null!==o.prev&&(a=o.prev,o.prev=a.prev,!r.call(i,a.data,a,this)););n(this)}},i.prototype.some=function(e,t){var n=this.head;for(void 0===t&&(t=this);null!==n;){if(e.call(t,n.data,n,this))return!0;n=n.next}return!1},i.prototype.map=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)n.appendData(e.call(t,r.data,r,this)),r=r.next;return n},i.prototype.filter=function(e,t){var n=new i,r=this.head;for(void 0===t&&(t=this);null!==r;)e.call(t,r.data,r,this)&&n.appendData(r.data),r=r.next;return n},i.prototype.clear=function(){this.head=null,this.tail=null},i.prototype.copy=function(){for(var t=new i,n=this.head;null!==n;)t.insert(e(n.data)),n=n.next;return t},i.prototype.prepend=function(e){return this.updateCursors(null,e,this.head,e),null!==this.head?(this.head.prev=e,e.next=this.head):this.tail=e,this.head=e,this},i.prototype.prependData=function(t){return this.prepend(e(t))},i.prototype.append=function(e){return this.insert(e)},i.prototype.appendData=function(t){return this.insert(e(t))},i.prototype.insert=function(e,t){if(null!=t)if(this.updateCursors(t.prev,e,t,e),null===t.prev){if(this.head!==t)throw new Error("before doesn't belong to list");this.head=e,t.prev=e,e.next=t,this.updateCursors(null,e)}else t.prev.next=e,e.prev=t.prev,t.prev=e,e.next=t;else this.updateCursors(this.tail,e,null,e),null!==this.tail?(this.tail.next=e,e.prev=this.tail):this.head=e,this.tail=e;return this},i.prototype.insertData=function(t,n){return this.insert(e(t),n)},i.prototype.remove=function(e){if(this.updateCursors(e,e.prev,e,e.next),null!==e.prev)e.prev.next=e.next;else{if(this.head!==e)throw new Error("item doesn't belong to list");this.head=e.next}if(null!==e.next)e.next.prev=e.prev;else{if(this.tail!==e)throw new Error("item doesn't belong to list");this.tail=e.prev}return e.prev=null,e.next=null,e},i.prototype.push=function(t){this.insert(e(t))},i.prototype.pop=function(){if(null!==this.tail)return this.remove(this.tail)},i.prototype.unshift=function(t){this.prepend(e(t))},i.prototype.shift=function(){if(null!==this.head)return this.remove(this.head)},i.prototype.prependList=function(e){return this.insertList(e,this.head)},i.prototype.appendList=function(e){return this.insertList(e)},i.prototype.insertList=function(e,t){return null===e.head||(null!=t?(this.updateCursors(t.prev,e.tail,t,e.head),null!==t.prev?(t.prev.next=e.head,e.head.prev=t.prev):this.head=e.head,t.prev=e.tail,e.tail.next=t):(this.updateCursors(this.tail,e.tail,null,e.head),null!==this.tail?(this.tail.next=e.head,e.head.prev=this.tail):this.head=e.head,this.tail=e.tail),e.head=null,e.tail=null),this},i.prototype.replace=function(e,t){"head"in t?this.insertList(t,e):this.insert(t,e),this.remove(e)};var a=i,o=function(e,t){var n=Object.create(SyntaxError.prototype),r=new Error;return n.name=e,n.message=t,Object.defineProperty(n,"stack",{get:function(){return(r.stack||"").replace(/^(.+\n){1,3}/,e+": "+t+"\n")}}),n};function s(e,t){function n(e,t){return r.slice(e,t).map((function(t,n){for(var r=String(e+n+1);r.length<l;)r=" "+r;return r+" |"+t})).join("\n")}var r=e.source.split(/\r\n?|\n|\f/),i=e.line,a=e.column,o=Math.max(1,i-t)-1,s=Math.min(i+t,r.length+1),l=Math.max(4,String(s).length)+1,c=0;(a+=(" ".length-1)*(r[i-1].substr(0,a-1).match(/\t/g)||[]).length)>100&&(c=a-60+3,a=58);for(var u=o;u<=s;u++)u>=0&&u<r.length&&(r[u]=r[u].replace(/\t/g," "),r[u]=(c>0&&r[u].length>c?"…":"")+r[u].substr(c,98)+(r[u].length>c+100-1?"…":""));return[n(o,i),new Array(a+l+2).join("-")+"^",n(i,s)].filter(Boolean).join("\n")}var l=function(e,t,n,r,i){var a=o("SyntaxError",e);return a.source=t,a.offset=n,a.line=r,a.column=i,a.sourceFragment=function(e){return s(a,isNaN(e)?0:e)},Object.defineProperty(a,"formattedMessage",{get:function(){return"Parse error: "+a.message+"\n"+s(a,2)}}),a.parseError={offset:n,line:r,column:i},a},c={EOF:0,Ident:1,Function:2,AtKeyword:3,Hash:4,String:5,BadString:6,Url:7,BadUrl:8,Delim:9,Number:10,Percentage:11,Dimension:12,WhiteSpace:13,CDO:14,CDC:15,Colon:16,Semicolon:17,Comma:18,LeftSquareBracket:19,RightSquareBracket:20,LeftParenthesis:21,RightParenthesis:22,LeftCurlyBracket:23,RightCurlyBracket:24,Comment:25},u=Object.keys(c).reduce((function(e,t){return e[c[t]]=t,e}),{}),h={TYPE:c,NAME:u};function p(e){return e>=48&&e<=57}function d(e){return e>=65&&e<=90}function m(e){return e>=97&&e<=122}function g(e){return d(e)||m(e)}function f(e){return e>=128}function b(e){return g(e)||f(e)||95===e}function y(e){return e>=0&&e<=8||11===e||e>=14&&e<=31||127===e}function k(e){return 10===e||13===e||12===e}function v(e){return k(e)||32===e||9===e}function x(e,t){return 92===e&&(!k(t)&&0!==t)}var w=new Array(128);C.Eof=128,C.WhiteSpace=130,C.Digit=131,C.NameStart=132,C.NonPrintable=133;for(var S=0;S<w.length;S++)switch(!0){case v(S):w[S]=C.WhiteSpace;break;case p(S):w[S]=C.Digit;break;case b(S):w[S]=C.NameStart;break;case y(S):w[S]=C.NonPrintable;break;default:w[S]=S||C.Eof}function C(e){return e<128?w[e]:C.NameStart}var z={isDigit:p,isHexDigit:function(e){return p(e)||e>=65&&e<=70||e>=97&&e<=102},isUppercaseLetter:d,isLowercaseLetter:m,isLetter:g,isNonAscii:f,isNameStart:b,isName:function(e){return b(e)||p(e)||45===e},isNonPrintable:y,isNewline:k,isWhiteSpace:v,isValidEscape:x,isIdentifierStart:function(e,t,n){return 45===e?b(t)||45===t||x(t,n):!!b(e)||92===e&&x(e,t)},isNumberStart:function(e,t,n){return 43===e||45===e?p(t)?2:46===t&&p(n)?3:0:46===e?p(t)?2:0:p(e)?1:0},isBOM:function(e){return 65279===e||65534===e?1:0},charCodeCategory:C},A=z.isDigit,P=z.isHexDigit,T=z.isUppercaseLetter,L=z.isName,E=z.isWhiteSpace,D=z.isValidEscape;function O(e,t){return t<e.length?e.charCodeAt(t):0}function B(e,t,n){return 13===n&&10===O(e,t+1)?2:1}function I(e,t,n){var r=e.charCodeAt(t);return T(r)&&(r|=32),r===n}function N(e,t){for(;t<e.length&&A(e.charCodeAt(t));t++);return t}function R(e,t){if(P(O(e,(t+=2)-1))){for(var n=Math.min(e.length,t+5);t<n&&P(O(e,t));t++);var r=O(e,t);E(r)&&(t+=B(e,t,r))}return t}var M={consumeEscaped:R,consumeName:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(!L(n)){if(!D(n,O(e,t+1)))break;t=R(e,t)-1}}return t},consumeNumber:function(e,t){var n=e.charCodeAt(t);if(43!==n&&45!==n||(n=e.charCodeAt(t+=1)),A(n)&&(t=N(e,t+1),n=e.charCodeAt(t)),46===n&&A(e.charCodeAt(t+1))&&(n=e.charCodeAt(t+=2),t=N(e,t)),I(e,t,101)){var r=0;45!==(n=e.charCodeAt(t+1))&&43!==n||(r=1,n=e.charCodeAt(t+2)),A(n)&&(t=N(e,t+1+r+1))}return t},consumeBadUrlRemnants:function(e,t){for(;t<e.length;t++){var n=e.charCodeAt(t);if(41===n){t++;break}D(n,O(e,t+1))&&(t=R(e,t))}return t},cmpChar:I,cmpStr:function(e,t,n,r){if(n-t!==r.length)return!1;if(t<0||n>e.length)return!1;for(var i=t;i<n;i++){var a=e.charCodeAt(i),o=r.charCodeAt(i-t);if(T(a)&&(a|=32),a!==o)return!1}return!0},getNewlineLength:B,findWhiteSpaceStart:function(e,t){for(;t>=0&&E(e.charCodeAt(t));t--);return t+1},findWhiteSpaceEnd:function(e,t){for(;t<e.length&&E(e.charCodeAt(t));t++);return t}},j=h.TYPE,_=h.NAME,F=M.cmpStr,W=j.EOF,q=j.WhiteSpace,Y=j.Comment,U=function(){this.offsetAndType=null,this.balance=null,this.reset()};U.prototype={reset:function(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset},lookupType:function(e){return(e+=this.tokenIndex)<this.tokenCount?this.offsetAndType[e]>>24:W},lookupOffset:function(e){return(e+=this.tokenIndex)<this.tokenCount?16777215&this.offsetAndType[e-1]:this.source.length},lookupValue:function(e,t){return(e+=this.tokenIndex)<this.tokenCount&&F(this.source,16777215&this.offsetAndType[e-1],16777215&this.offsetAndType[e],t)},getTokenStart:function(e){return e===this.tokenIndex?this.tokenStart:e>0?e<this.tokenCount?16777215&this.offsetAndType[e-1]:16777215&this.offsetAndType[this.tokenCount]:this.firstCharOffset},getRawLength:function(e,t){var n,r=e,i=16777215&this.offsetAndType[Math.max(r-1,0)];e:for(;r<this.tokenCount&&!((n=this.balance[r])<e);r++)switch(t(this.offsetAndType[r]>>24,this.source,i)){case 1:break e;case 2:r++;break e;default:i=16777215&this.offsetAndType[r],this.balance[n]===r&&(r=n)}return r-this.tokenIndex},isBalanceEdge:function(e){return this.balance[this.tokenIndex]<e},isDelim:function(e,t){return t?this.lookupType(t)===j.Delim&&this.source.charCodeAt(this.lookupOffset(t))===e:this.tokenType===j.Delim&&this.source.charCodeAt(this.tokenStart)===e},getTokenValue:function(){return this.source.substring(this.tokenStart,this.tokenEnd)},getTokenLength:function(){return this.tokenEnd-this.tokenStart},substrToCursor:function(e){return this.source.substring(e,this.tokenStart)},skipWS:function(){for(var e=this.tokenIndex,t=0;e<this.tokenCount&&this.offsetAndType[e]>>24===q;e++,t++);t>0&&this.skip(t)},skipSC:function(){for(;this.tokenType===q||this.tokenType===Y;)this.next()},skip:function(e){var t=this.tokenIndex+e;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=16777215&this.offsetAndType[t-1],t=this.offsetAndType[t],this.tokenType=t>>24,this.tokenEnd=16777215&t):(this.tokenIndex=this.tokenCount,this.next())},next:function(){var e=this.tokenIndex+1;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.tokenEnd,e=this.offsetAndType[e],this.tokenType=e>>24,this.tokenEnd=16777215&e):(this.tokenIndex=this.tokenCount,this.eof=!0,this.tokenType=W,this.tokenStart=this.tokenEnd=this.source.length)},forEachToken(e){for(var t=0,n=this.firstCharOffset;t<this.tokenCount;t++){var r=n,i=this.offsetAndType[t],a=16777215&i;n=a,e(i>>24,r,a,t)}},dump(){var e=new Array(this.tokenCount);return this.forEachToken((t,n,r,i)=>{e[i]={idx:i,type:_[t],chunk:this.source.substring(n,r),balance:this.balance[i]}}),e}};var H=U;function V(e){return e}function K(e,t,n,r){var i,a;switch(e.type){case"Group":i=function(e,t,n,r){var i=" "===e.combinator||r?e.combinator:" "+e.combinator+" ",a=e.terms.map((function(e){return K(e,t,n,r)})).join(i);return(e.explicit||n)&&(a=(r||","===a[0]?"[":"[ ")+a+(r?"]":" ]")),a}(e,t,n,r)+(e.disallowEmpty?"!":"");break;case"Multiplier":return K(e.term,t,n,r)+t(0===(a=e).min&&0===a.max?"*":0===a.min&&1===a.max?"?":1===a.min&&0===a.max?a.comma?"#":"+":1===a.min&&1===a.max?"":(a.comma?"#":"")+(a.min===a.max?"{"+a.min+"}":"{"+a.min+","+(0!==a.max?a.max:"")+"}"),e);case"Type":i="<"+e.name+(e.opts?t(function(e){switch(e.type){case"Range":return" ["+(null===e.min?"-∞":e.min)+","+(null===e.max?"∞":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}(e.opts),e.opts):"")+">";break;case"Property":i="<'"+e.name+"'>";break;case"Keyword":i=e.name;break;case"AtKeyword":i="@"+e.name;break;case"Function":i=e.name+"(";break;case"String":case"Token":i=e.value;break;case"Comma":i=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(i,e)}var G=function(e,t){var n=V,r=!1,i=!1;return"function"==typeof t?n=t:t&&(r=Boolean(t.forceBraces),i=Boolean(t.compact),"function"==typeof t.decorate&&(n=t.decorate)),K(e,n,r,i)};const Q={offset:0,line:1,column:1};function X(e,t){const n=e&&e.loc&&e.loc[t];return n?"line"in n?Z(n):n:null}function Z({offset:e,line:t,column:n},r){const i={offset:e,line:t,column:n};if(r){const e=r.split(/\n|\r\n?|\f/);i.offset+=r.length,i.line+=e.length-1,i.column=1===e.length?i.column+r.length:e.pop().length+1}return i}var $=function(e,t){const n=o("SyntaxReferenceError",e+(t?" `"+t+"`":""));return n.reference=t,n},J=function(e,t,n,r){const i=o("SyntaxMatchError",e),{css:a,mismatchOffset:s,mismatchLength:l,start:c,end:u}=function(e,t){const n=e.tokens,r=e.longestMatch,i=r<n.length&&n[r].node||null,a=i!==t?i:null;let o,s,l=0,c=0,u=0,h="";for(let e=0;e<n.length;e++){const t=n[e].value;e===r&&(c=t.length,l=h.length),null!==a&&n[e].node===a&&(e<=r?u++:u=0),h+=t}return r===n.length||u>1?(o=X(a||t,"end")||Z(Q,h),s=Z(o)):(o=X(a,"start")||Z(X(t,"start")||Q,h.slice(0,l)),s=X(a,"end")||Z(o,h.substr(l,c))),{css:h,mismatchOffset:l,mismatchLength:c,start:o,end:s}}(r,n);return i.rawMessage=e,i.syntax=t?G(t):"<generic>",i.css=a,i.mismatchOffset=s,i.mismatchLength=l,i.message=e+"\n syntax: "+i.syntax+"\n value: "+(a||"<empty string>")+"\n --------"+new Array(i.mismatchOffset+1).join("-")+"^",Object.assign(i,c),i.loc={source:n&&n.loc&&n.loc.source||"<unknown>",start:c,end:u},i},ee=Object.prototype.hasOwnProperty,te=Object.create(null),ne=Object.create(null);function re(e,t){return t=t||0,e.length-t>=2&&45===e.charCodeAt(t)&&45===e.charCodeAt(t+1)}function ie(e,t){if(t=t||0,e.length-t>=3&&45===e.charCodeAt(t)&&45!==e.charCodeAt(t+1)){var n=e.indexOf("-",t+2);if(-1!==n)return e.substring(t,n+1)}return""}var ae={keyword:function(e){if(ee.call(te,e))return te[e];var t=e.toLowerCase();if(ee.call(te,t))return te[e]=te[t];var n=re(t,0),r=n?"":ie(t,0);return te[e]=Object.freeze({basename:t.substr(r.length),name:t,vendor:r,prefix:r,custom:n})},property:function(e){if(ee.call(ne,e))return ne[e];var t=e,n=e[0];"/"===n?n="/"===e[1]?"//":"/":"_"!==n&&"*"!==n&&"$"!==n&&"#"!==n&&"+"!==n&&"&"!==n&&(n="");var r=re(t,n.length);if(!r&&(t=t.toLowerCase(),ee.call(ne,t)))return ne[e]=ne[t];var i=r?"":ie(t,n.length),a=t.substr(0,n.length+i.length);return ne[e]=Object.freeze({basename:t.substr(a.length),name:t.substr(n.length),hack:n,vendor:i,prefix:a,custom:r})},isCustomProperty:re,vendorPrefix:ie},oe="undefined"!=typeof Uint32Array?Uint32Array:Array,se=function(e,t){return null===e||e.length<t?new oe(Math.max(t+1024,16384)):e},le=h.TYPE,ce=z.isNewline,ue=z.isName,he=z.isValidEscape,pe=z.isNumberStart,de=z.isIdentifierStart,me=z.charCodeCategory,ge=z.isBOM,fe=M.cmpStr,be=M.getNewlineLength,ye=M.findWhiteSpaceEnd,ke=M.consumeEscaped,ve=M.consumeName,xe=M.consumeNumber,we=M.consumeBadUrlRemnants;function Se(e,t){function n(t){return t<o?e.charCodeAt(t):0}function r(){return h=xe(e,h),de(n(h),n(h+1),n(h+2))?(f=le.Dimension,void(h=ve(e,h))):37===n(h)?(f=le.Percentage,void h++):void(f=le.Number)}function i(){const t=h;return h=ve(e,h),fe(e,t,h,"url")&&40===n(h)?34===n(h=ye(e,h+1))||39===n(h)?(f=le.Function,void(h=t+4)):void function(){for(f=le.Url,h=ye(e,h);h<e.length;h++){var t=e.charCodeAt(h);switch(me(t)){case 41:return void h++;case me.Eof:return;case me.WhiteSpace:return 41===n(h=ye(e,h))||h>=e.length?void(h<e.length&&h++):(h=we(e,h),void(f=le.BadUrl));case 34:case 39:case 40:case me.NonPrintable:return h=we(e,h),void(f=le.BadUrl);case 92:if(he(t,n(h+1))){h=ke(e,h)-1;break}return h=we(e,h),void(f=le.BadUrl)}}}():40===n(h)?(f=le.Function,void h++):void(f=le.Ident)}function a(t){for(t||(t=n(h++)),f=le.String;h<e.length;h++){var r=e.charCodeAt(h);switch(me(r)){case t:return void h++;case me.Eof:return;case me.WhiteSpace:if(ce(r))return h+=be(e,h,r),void(f=le.BadString);break;case 92:if(h===e.length-1)break;var i=n(h+1);ce(i)?h+=be(e,h+1,i):he(r,i)&&(h=ke(e,h)-1)}}}t||(t=new H);for(var o=(e=String(e||"")).length,s=se(t.offsetAndType,o+1),l=se(t.balance,o+1),c=0,u=ge(n(0)),h=u,p=0,d=0,m=0;h<o;){var g=e.charCodeAt(h),f=0;switch(l[c]=o,me(g)){case me.WhiteSpace:f=le.WhiteSpace,h=ye(e,h+1);break;case 34:a();break;case 35:ue(n(h+1))||he(n(h+1),n(h+2))?(f=le.Hash,h=ve(e,h+1)):(f=le.Delim,h++);break;case 39:a();break;case 40:f=le.LeftParenthesis,h++;break;case 41:f=le.RightParenthesis,h++;break;case 43:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 44:f=le.Comma,h++;break;case 45:pe(g,n(h+1),n(h+2))?r():45===n(h+1)&&62===n(h+2)?(f=le.CDC,h+=3):de(g,n(h+1),n(h+2))?i():(f=le.Delim,h++);break;case 46:pe(g,n(h+1),n(h+2))?r():(f=le.Delim,h++);break;case 47:42===n(h+1)?(f=le.Comment,1===(h=e.indexOf("*/",h+2)+2)&&(h=e.length)):(f=le.Delim,h++);break;case 58:f=le.Colon,h++;break;case 59:f=le.Semicolon,h++;break;case 60:33===n(h+1)&&45===n(h+2)&&45===n(h+3)?(f=le.CDO,h+=4):(f=le.Delim,h++);break;case 64:de(n(h+1),n(h+2),n(h+3))?(f=le.AtKeyword,h=ve(e,h+1)):(f=le.Delim,h++);break;case 91:f=le.LeftSquareBracket,h++;break;case 92:he(g,n(h+1))?i():(f=le.Delim,h++);break;case 93:f=le.RightSquareBracket,h++;break;case 123:f=le.LeftCurlyBracket,h++;break;case 125:f=le.RightCurlyBracket,h++;break;case me.Digit:r();break;case me.NameStart:i();break;case me.Eof:break;default:f=le.Delim,h++}switch(f){case p:for(p=(d=l[m=16777215&d])>>24,l[c]=m,l[m++]=c;m<c;m++)l[m]===o&&(l[m]=c);break;case le.LeftParenthesis:case le.Function:l[c]=d,d=(p=le.RightParenthesis)<<24|c;break;case le.LeftSquareBracket:l[c]=d,d=(p=le.RightSquareBracket)<<24|c;break;case le.LeftCurlyBracket:l[c]=d,d=(p=le.RightCurlyBracket)<<24|c}s[c++]=f<<24|h}for(s[c]=le.EOF<<24|h,l[c]=o,l[o]=o;0!==d;)d=l[m=16777215&d],l[m]=o;return t.source=e,t.firstCharOffset=u,t.offsetAndType=s,t.tokenCount=c,t.balance=l,t.reset(),t.next(),t}Object.keys(h).forEach((function(e){Se[e]=h[e]})),Object.keys(z).forEach((function(e){Se[e]=z[e]})),Object.keys(M).forEach((function(e){Se[e]=M[e]}));var Ce=Se,ze=Ce.isDigit,Ae=Ce.cmpChar,Pe=Ce.TYPE,Te=Pe.Delim,Le=Pe.WhiteSpace,Ee=Pe.Comment,De=Pe.Ident,Oe=Pe.Number,Be=Pe.Dimension;function Ie(e,t){return null!==e&&e.type===Te&&e.value.charCodeAt(0)===t}function Ne(e,t,n){for(;null!==e&&(e.type===Le||e.type===Ee);)e=n(++t);return t}function Re(e,t,n,r){if(!e)return 0;var i=e.value.charCodeAt(t);if(43===i||45===i){if(n)return 0;t++}for(;t<e.value.length;t++)if(!ze(e.value.charCodeAt(t)))return 0;return r+1}function Me(e,t,n){var r=!1,i=Ne(e,t,n);if(null===(e=n(i)))return t;if(e.type!==Oe){if(!Ie(e,43)&&!Ie(e,45))return t;if(r=!0,i=Ne(n(++i),i,n),null===(e=n(i))&&e.type!==Oe)return 0}if(!r){var a=e.value.charCodeAt(0);if(43!==a&&45!==a)return 0}return Re(e,r?0:1,r,i)}var je=Ce.isHexDigit,_e=Ce.cmpChar,Fe=Ce.TYPE,We=Fe.Ident,qe=Fe.Delim,Ye=Fe.Number,Ue=Fe.Dimension;function He(e,t){return null!==e&&e.type===qe&&e.value.charCodeAt(0)===t}function Ve(e,t){return e.value.charCodeAt(0)===t}function Ke(e,t,n){for(var r=t,i=0;r<e.value.length;r++){var a=e.value.charCodeAt(r);if(45===a&&n&&0!==i)return Ke(e,t+i+1,!1)>0?6:0;if(!je(a))return 0;if(++i>6)return 0}return i}function Ge(e,t,n){if(!e)return 0;for(;He(n(t),63);){if(++e>6)return 0;t++}return t}var Qe=Ce.isIdentifierStart,Xe=Ce.isHexDigit,Ze=Ce.isDigit,$e=Ce.cmpStr,Je=Ce.consumeNumber,et=Ce.TYPE,tt=["unset","initial","inherit"],nt=["calc(","-moz-calc(","-webkit-calc("];function rt(e,t){return t<e.length?e.charCodeAt(t):0}function it(e,t){return $e(e,0,e.length,t)}function at(e,t){for(var n=0;n<t.length;n++)if(it(e,t[n]))return!0;return!1}function ot(e,t){return t===e.length-2&&(92===e.charCodeAt(t)&&Ze(e.charCodeAt(t+1)))}function st(e,t,n){if(e&&"Range"===e.type){var r=Number(void 0!==n&&n!==t.length?t.substr(0,n):t);if(isNaN(r))return!0;if(null!==e.min&&r<e.min)return!0;if(null!==e.max&&r>e.max)return!0}return!1}function lt(e,t){var n=e.index,r=0;do{if(r++,e.balance<=n)break}while(e=t(r));return r}function ct(e){return function(t,n,r){return null===t?0:t.type===et.Function&&at(t.value,nt)?lt(t,n):e(t,n,r)}}function ut(e){return function(t){return null===t||t.type!==e?0:1}}function ht(e){return function(t,n,r){if(null===t||t.type!==et.Dimension)return 0;var i=Je(t.value,0);if(null!==e){var a=t.value.indexOf("\\",i),o=-1!==a&&ot(t.value,a)?t.value.substring(i,a):t.value.substr(i);if(!1===e.hasOwnProperty(o.toLowerCase()))return 0}return st(r,t.value,i)?0:1}}function pt(e){return"function"!=typeof e&&(e=function(){return 0}),function(t,n,r){return null!==t&&t.type===et.Number&&0===Number(t.value)?1:e(t,n,r)}}var dt,mt={"ident-token":ut(et.Ident),"function-token":ut(et.Function),"at-keyword-token":ut(et.AtKeyword),"hash-token":ut(et.Hash),"string-token":ut(et.String),"bad-string-token":ut(et.BadString),"url-token":ut(et.Url),"bad-url-token":ut(et.BadUrl),"delim-token":ut(et.Delim),"number-token":ut(et.Number),"percentage-token":ut(et.Percentage),"dimension-token":ut(et.Dimension),"whitespace-token":ut(et.WhiteSpace),"CDO-token":ut(et.CDO),"CDC-token":ut(et.CDC),"colon-token":ut(et.Colon),"semicolon-token":ut(et.Semicolon),"comma-token":ut(et.Comma),"[-token":ut(et.LeftSquareBracket),"]-token":ut(et.RightSquareBracket),"(-token":ut(et.LeftParenthesis),")-token":ut(et.RightParenthesis),"{-token":ut(et.LeftCurlyBracket),"}-token":ut(et.RightCurlyBracket),string:ut(et.String),ident:ut(et.Ident),"custom-ident":function(e){if(null===e||e.type!==et.Ident)return 0;var t=e.value.toLowerCase();return at(t,tt)||it(t,"default")?0:1},"custom-property-name":function(e){return null===e||e.type!==et.Ident||45!==rt(e.value,0)||45!==rt(e.value,1)?0:1},"hex-color":function(e){if(null===e||e.type!==et.Hash)return 0;var t=e.value.length;if(4!==t&&5!==t&&7!==t&&9!==t)return 0;for(var n=1;n<t;n++)if(!Xe(e.value.charCodeAt(n)))return 0;return 1},"id-selector":function(e){return null===e||e.type!==et.Hash?0:Qe(rt(e.value,1),rt(e.value,2),rt(e.value,3))?1:0},"an-plus-b":function(e,t){var n=0;if(!e)return 0;if(e.type===Oe)return Re(e,0,!1,n);if(e.type===De&&45===e.value.charCodeAt(0)){if(!Ae(e.value,1,110))return 0;switch(e.value.length){case 2:return Me(t(++n),n,t);case 3:return 45!==e.value.charCodeAt(2)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(2)?0:Re(e,3,!0,n)}}else if(e.type===De||Ie(e,43)&&t(n+1).type===De){if(e.type!==De&&(e=t(++n)),null===e||!Ae(e.value,0,110))return 0;switch(e.value.length){case 1:return Me(t(++n),n,t);case 2:return 45!==e.value.charCodeAt(1)?0:(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n));default:return 45!==e.value.charCodeAt(1)?0:Re(e,2,!0,n)}}else if(e.type===Be){for(var r=e.value.charCodeAt(0),i=43===r||45===r?1:0,a=i;a<e.value.length&&ze(e.value.charCodeAt(a));a++);return a===i?0:Ae(e.value,a,110)?a+1===e.value.length?Me(t(++n),n,t):45!==e.value.charCodeAt(a+1)?0:a+2===e.value.length?(n=Ne(t(++n),n,t),Re(e=t(n),0,!0,n)):Re(e,a+2,!0,n):0}return 0},urange:function(e,t){var n=0;if(null===e||e.type!==We||!_e(e.value,0,117))return 0;if(null===(e=t(++n)))return 0;if(He(e,43))return null===(e=t(++n))?0:e.type===We?Ge(Ke(e,0,!0),++n,t):He(e,63)?Ge(1,++n,t):0;if(e.type===Ye){if(!Ve(e,43))return 0;var r=Ke(e,1,!0);return 0===r?0:null===(e=t(++n))?n:e.type===Ue||e.type===Ye?Ve(e,45)&&Ke(e,1,!1)?n+1:0:Ge(r,n,t)}return e.type===Ue&&Ve(e,43)?Ge(Ke(e,1,!0),++n,t):0},"declaration-value":function(e,t){if(!e)return 0;var n=0,r=0,i=e.index;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<i)break e;r--;break;case et.Semicolon:if(0===r)break e;break;case et.Delim:if("!"===e.value&&0===r)break e;break;case et.Function:case et.LeftParenthesis:case et.LeftSquareBracket:case et.LeftCurlyBracket:r++}if(n++,e.balance<=i)break}while(e=t(n));return n},"any-value":function(e,t){if(!e)return 0;var n=e.index,r=0;e:do{switch(e.type){case et.BadString:case et.BadUrl:break e;case et.RightCurlyBracket:case et.RightParenthesis:case et.RightSquareBracket:if(e.balance>e.index||e.balance<n)break e}if(r++,e.balance<=n)break}while(e=t(r));return r},dimension:ct(ht(null)),angle:ct(ht({deg:!0,grad:!0,rad:!0,turn:!0})),decibel:ct(ht({db:!0})),frequency:ct(ht({hz:!0,khz:!0})),flex:ct(ht({fr:!0})),length:ct(pt(ht({px:!0,mm:!0,cm:!0,in:!0,pt:!0,pc:!0,q:!0,em:!0,ex:!0,ch:!0,rem:!0,vh:!0,vw:!0,vmin:!0,vmax:!0,vm:!0}))),resolution:ct(ht({dpi:!0,dpcm:!0,dppx:!0,x:!0})),semitones:ct(ht({st:!0})),time:ct(ht({s:!0,ms:!0})),percentage:ct((function(e,t,n){return null===e||e.type!==et.Percentage||st(n,e.value,e.value.length-1)?0:1})),zero:pt(),number:ct((function(e,t,n){if(null===e)return 0;var r=Je(e.value,0);return r===e.value.length||ot(e.value,r)?st(n,e.value,r)?0:1:0})),integer:ct((function(e,t,n){if(null===e||e.type!==et.Number)return 0;for(var r=43===e.value.charCodeAt(0)||45===e.value.charCodeAt(0)?1:0;r<e.value.length;r++)if(!Ze(e.value.charCodeAt(r)))return 0;return st(n,e.value,r)?0:1})),"-ms-legacy-expression":(dt="expression",dt+="(",function(e,t){return null!==e&&it(e.value,dt)?lt(e,t):0})},gt=function(e,t,n){var r=o("SyntaxError",e);return r.input=t,r.offset=n,r.rawMessage=e,r.message=r.rawMessage+"\n "+r.input+"\n--"+new Array((r.offset||r.input.length)+1).join("-")+"^",r},ft=function(e){this.str=e,this.pos=0};ft.prototype={charCodeAt:function(e){return e<this.str.length?this.str.charCodeAt(e):0},charCode:function(){return this.charCodeAt(this.pos)},nextCharCode:function(){return this.charCodeAt(this.pos+1)},nextNonWsCode:function(e){return this.charCodeAt(this.findWsEnd(e))},findWsEnd:function(e){for(;e<this.str.length;e++){var t=this.str.charCodeAt(e);if(13!==t&&10!==t&&12!==t&&32!==t&&9!==t)break}return e},substringToPos:function(e){return this.str.substring(this.pos,this.pos=e)},eat:function(e){this.charCode()!==e&&this.error("Expect `"+String.fromCharCode(e)+"`"),this.pos++},peek:function(){return this.pos<this.str.length?this.str.charAt(this.pos++):""},error:function(e){throw new gt(e,this.str,this.pos)}};var bt=ft,yt=function(e){for(var t="function"==typeof Uint32Array?new Uint32Array(128):new Array(128),n=0;n<128;n++)t[n]=e(String.fromCharCode(n))?1:0;return t}((function(e){return/[a-zA-Z0-9\-]/.test(e)})),kt={" ":1,"&&":2,"||":3,"|":4};function vt(e){return e.substringToPos(e.findWsEnd(e.pos))}function xt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n>=128||0===yt[n])break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function wt(e){for(var t=e.pos;t<e.str.length;t++){var n=e.str.charCodeAt(t);if(n<48||n>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function St(e){var t=e.str.indexOf("'",e.pos+1);return-1===t&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Ct(e){var t,n=null;return e.eat(123),t=wt(e),44===e.charCode()?(e.pos++,125!==e.charCode()&&(n=wt(e))):n=t,e.eat(125),{min:Number(t),max:n?Number(n):0}}function zt(e,t){var n=function(e){var t=null,n=!1;switch(e.charCode()){case 42:e.pos++,t={min:0,max:0};break;case 43:e.pos++,t={min:1,max:0};break;case 63:e.pos++,t={min:0,max:1};break;case 35:e.pos++,n=!0,t=123===e.charCode()?Ct(e):{min:1,max:0};break;case 123:t=Ct(e);break;default:return null}return{type:"Multiplier",comma:n,min:t.min,max:t.max,term:null}}(e);return null!==n?(n.term=t,n):t}function At(e){var t=e.peek();return""===t?null:{type:"Token",value:t}}function Pt(e){var t,n=null;return e.eat(60),t=xt(e),40===e.charCode()&&41===e.nextCharCode()&&(e.pos+=2,t+="()"),91===e.charCodeAt(e.findWsEnd(e.pos))&&(vt(e),n=function(e){var t=null,n=null,r=1;return e.eat(91),45===e.charCode()&&(e.peek(),r=-1),-1==r&&8734===e.charCode()?e.peek():t=r*Number(wt(e)),vt(e),e.eat(44),vt(e),8734===e.charCode()?e.peek():(r=1,45===e.charCode()&&(e.peek(),r=-1),n=r*Number(wt(e))),e.eat(93),null===t&&null===n?null:{type:"Range",min:t,max:n}}(e)),e.eat(62),zt(e,{type:"Type",name:t,opts:n})}function Tt(e,t){function n(e,t){return{type:"Group",terms:e,combinator:t,disallowEmpty:!1,explicit:!1}}for(t=Object.keys(t).sort((function(e,t){return kt[e]-kt[t]}));t.length>0;){for(var r=t.shift(),i=0,a=0;i<e.length;i++){var o=e[i];"Combinator"===o.type&&(o.value===r?(-1===a&&(a=i-1),e.splice(i,1),i--):(-1!==a&&i-a>1&&(e.splice(a,i-a,n(e.slice(a,i),r)),i=a+1),a=-1))}-1!==a&&t.length&&e.splice(a,i-a,n(e.slice(a,i),r))}return r}function Lt(e){for(var t,n=[],r={},i=null,a=e.pos;t=Et(e);)"Spaces"!==t.type&&("Combinator"===t.type?(null!==i&&"Combinator"!==i.type||(e.pos=a,e.error("Unexpected combinator")),r[t.value]=!0):null!==i&&"Combinator"!==i.type&&(r[" "]=!0,n.push({type:"Combinator",value:" "})),n.push(t),i=t,a=e.pos);return null!==i&&"Combinator"===i.type&&(e.pos-=a,e.error("Unexpected combinator")),{type:"Group",terms:n,combinator:Tt(n,r)||" ",disallowEmpty:!1,explicit:!1}}function Et(e){var t=e.charCode();if(t<128&&1===yt[t])return function(e){var t;return t=xt(e),40===e.charCode()?(e.pos++,{type:"Function",name:t}):zt(e,{type:"Keyword",name:t})}(e);switch(t){case 93:break;case 91:return zt(e,function(e){var t;return e.eat(91),t=Lt(e),e.eat(93),t.explicit=!0,33===e.charCode()&&(e.pos++,t.disallowEmpty=!0),t}(e));case 60:return 39===e.nextCharCode()?function(e){var t;return e.eat(60),e.eat(39),t=xt(e),e.eat(39),e.eat(62),zt(e,{type:"Property",name:t})}(e):Pt(e);case 124:return{type:"Combinator",value:e.substringToPos(124===e.nextCharCode()?e.pos+2:e.pos+1)};case 38:return e.pos++,e.eat(38),{type:"Combinator",value:"&&"};case 44:return e.pos++,{type:"Comma"};case 39:return zt(e,{type:"String",value:St(e)});case 32:case 9:case 10:case 13:case 12:return{type:"Spaces",value:vt(e)};case 64:return(t=e.nextCharCode())<128&&1===yt[t]?(e.pos++,{type:"AtKeyword",name:xt(e)}):At(e);case 42:case 43:case 63:case 35:case 33:break;case 123:if((t=e.nextCharCode())<48||t>57)return At(e);break;default:return At(e)}}function Dt(e){var t=new bt(e),n=Lt(t);return t.pos!==e.length&&t.error("Unexpected input"),1===n.terms.length&&"Group"===n.terms[0].type&&(n=n.terms[0]),n}Dt("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!");var Ot=Dt,Bt=function(){};function It(e){return"function"==typeof e?e:Bt}var Nt=function(e,t,n){var r=Bt,i=Bt;if("function"==typeof t?r=t:t&&(r=It(t.enter),i=It(t.leave)),r===Bt&&i===Bt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");!function e(t){switch(r.call(n,t),t.type){case"Group":t.terms.forEach(e);break;case"Multiplier":e(t.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+t.type)}i.call(n,t)}(e)},Rt=new H,Mt={decorator:function(e){var t=null,n={len:0,node:null},r=[n],i="";return{children:e.children,node:function(n){var r=t;t=n,e.node.call(this,n),t=r},chunk:function(e){i+=e,n.node!==t?r.push({len:e.length,node:t}):n.len+=e.length},result:function(){return jt(i,r)}}}};function jt(e,t){var n=[],r=0,i=0,a=t?t[i].node:null;for(Ce(e,Rt);!Rt.eof;){if(t)for(;i<t.length&&r+t[i].len<=Rt.tokenStart;)r+=t[i++].len,a=t[i].node;n.push({type:Rt.tokenType,value:Rt.getTokenValue(),index:Rt.tokenIndex,balance:Rt.balance[Rt.tokenIndex],node:a}),Rt.next()}return n}var _t={type:"Match"},Ft={type:"Mismatch"},Wt={type:"DisallowEmpty"};function qt(e,t,n){return t===_t&&n===Ft||e===_t&&t===_t&&n===_t?e:("If"===e.type&&e.else===Ft&&t===_t&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:n})}function Yt(e){return e.length>2&&40===e.charCodeAt(e.length-2)&&41===e.charCodeAt(e.length-1)}function Ut(e){return"Keyword"===e.type||"AtKeyword"===e.type||"Function"===e.type||"Type"===e.type&&Yt(e.name)}function Ht(e){if("function"==typeof e)return{type:"Generic",fn:e};switch(e.type){case"Group":var t=function e(t,n,r){switch(t){case" ":for(var i=_t,a=n.length-1;a>=0;a--){i=qt(l=n[a],i,Ft)}return i;case"|":i=Ft;var o=null;for(a=n.length-1;a>=0;a--){if(Ut(l=n[a])&&(null===o&&a>0&&Ut(n[a-1])&&(i=qt({type:"Enum",map:o=Object.create(null)},_t,i)),null!==o)){var s=(Yt(l.name)?l.name.slice(0,-1):l.name).toLowerCase();if(s in o==!1){o[s]=l;continue}}o=null,i=qt(l,_t,i)}return i;case"&&":if(n.length>5)return{type:"MatchOnce",terms:n,all:!0};for(i=Ft,a=n.length-1;a>=0;a--){var l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!1):_t,i=qt(l,c,i)}return i;case"||":if(n.length>5)return{type:"MatchOnce",terms:n,all:!1};for(i=r?_t:Ft,a=n.length-1;a>=0;a--){var c;l=n[a];c=n.length>1?e(t,n.filter((function(e){return e!==l})),!0):_t,i=qt(l,c,i)}return i}}(e.combinator,e.terms.map(Ht),!1);return e.disallowEmpty&&(t=qt(t,Wt,Ft)),t;case"Multiplier":return function(e){var t=_t,n=Ht(e.term);if(0===e.max)n=qt(n,Wt,Ft),(t=qt(n,null,Ft)).then=qt(_t,_t,t),e.comma&&(t.then.else=qt({type:"Comma",syntax:e},t,Ft));else for(var r=e.min||1;r<=e.max;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,qt(_t,_t,t),Ft);if(0===e.min)t=qt(_t,_t,t);else for(r=0;r<e.min-1;r++)e.comma&&t!==_t&&(t=qt({type:"Comma",syntax:e},t,Ft)),t=qt(n,t,Ft);return t}(e);case"Type":case"Property":return{type:e.type,name:e.name,syntax:e};case"Keyword":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return{type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return{type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return 3===e.value.length?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return{type:e.type,value:e.value,syntax:e};case"Comma":return{type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}var Vt=_t,Kt=Ft,Gt=Wt,Qt=function(e,t){return"string"==typeof e&&(e=Ot(e)),{type:"MatchGraph",match:Ht(e),syntax:t||null,source:e}},Xt=Object.prototype.hasOwnProperty,Zt=Vt,$t=Kt,Jt=Gt,en=h.TYPE;function tn(e){for(var t=null,n=null,r=e;null!==r;)n=r.prev,r.prev=t,t=r,r=n;return t}function nn(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r>=65&&r<=90&&(r|=32),r!==t.charCodeAt(n))return!1}return!0}function rn(e){return null===e||(e.type===en.Comma||e.type===en.Function||e.type===en.LeftParenthesis||e.type===en.LeftSquareBracket||e.type===en.LeftCurlyBracket||function(e){return e.type===en.Delim&&"?"!==e.value}(e))}function an(e){return null===e||(e.type===en.RightParenthesis||e.type===en.RightSquareBracket||e.type===en.RightCurlyBracket||e.type===en.Delim)}function on(e,t,n){function r(){do{b++,f=b<e.length?e[b]:null}while(null!==f&&(f.type===en.WhiteSpace||f.type===en.Comment))}function i(t){var n=b+t;return n<e.length?e[n]:null}function a(e,t){return{nextState:e,matchStack:k,syntaxStack:u,thenStack:h,tokenIndex:b,prev:t}}function o(e){h={nextState:e,matchStack:k,syntaxStack:u,prev:h}}function s(e){p=a(e,p)}function l(){k={type:1,syntax:t.syntax,token:f,prev:k},r(),d=null,b>y&&(y=b)}function c(){k=2===k.type?k.prev:{type:3,syntax:u.syntax,token:k.token,prev:k},u=u.prev}var u=null,h=null,p=null,d=null,m=0,g=null,f=null,b=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(r();null===g&&++m<15e3;)switch(t.type){case"Match":if(null===h){if(null!==f&&(b!==e.length-1||"\\0"!==f.value&&"\\9"!==f.value)){t=$t;break}g="Match";break}if((t=h.nextState)===Jt){if(h.matchStack===k){t=$t;break}t=Zt}for(;h.syntaxStack!==u;)c();h=h.prev;break;case"Mismatch":if(null!==d&&!1!==d)(null===p||b>p.tokenIndex)&&(p=d,d=!1);else if(null===p){g="Mismatch";break}t=p.nextState,h=p.thenStack,u=p.syntaxStack,k=p.matchStack,b=p.tokenIndex,f=b<e.length?e[b]:null,p=p.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==$t&&s(t.else),t.then!==Zt&&o(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":var v=t.syntax.terms;if(t.index===v.length){if(0===t.mask||t.syntax.all){t=$t;break}t=Zt;break}if(t.mask===(1<<v.length)-1){t=Zt;break}for(;t.index<v.length;t.index++){var x=1<<t.index;if(0==(t.mask&x)){s(t),o({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|x}),t=v[t.index++];break}}break;case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(null!==f)if(-1!==(A=f.value.toLowerCase()).indexOf("\\")&&(A=A.replace(/\\[09].*$/,"")),Xt.call(t.map,A)){t=t.map[A];break}t=$t;break;case"Generic":var w=null!==u?u.opts:null,S=b+Math.floor(t.fn(f,i,w));if(!isNaN(S)&&S>b){for(;b<S;)l();t=Zt}else t=$t;break;case"Type":case"Property":var C="Type"===t.type?"types":"properties",z=Xt.call(n,C)?n[C][t.name]:null;if(!z||!z.match)throw new Error("Bad syntax reference: "+("Type"===t.type?"<"+t.name+">":"<'"+t.name+"'>"));if(!1!==d&&null!==f&&"Type"===t.type)if("custom-ident"===t.name&&f.type===en.Ident||"length"===t.name&&"0"===f.value){null===d&&(d=a(t,p)),t=$t;break}u={syntax:t.syntax,opts:t.syntax.opts||null!==u&&u.opts||null,prev:u},k={type:2,syntax:t.syntax,token:k.token,prev:k},t=z.match;break;case"Keyword":var A=t.name;if(null!==f){var P=f.value;if(-1!==P.indexOf("\\")&&(P=P.replace(/\\[09].*$/,"")),nn(P,A)){l(),t=Zt;break}}t=$t;break;case"AtKeyword":case"Function":if(null!==f&&nn(f.value,t.name)){l(),t=Zt;break}t=$t;break;case"Token":if(null!==f&&f.value===t.value){l(),t=Zt;break}t=$t;break;case"Comma":null!==f&&f.type===en.Comma?rn(k.token)?t=$t:(l(),t=an(f)?$t:Zt):t=rn(k.token)||an(f)?Zt:$t;break;case"String":var T="";for(S=b;S<e.length&&T.length<t.value.length;S++)T+=e[S].value;if(nn(T,t.value)){for(;b<S;)l();t=Zt}else t=$t;break;default:throw new Error("Unknown node type: "+t.type)}switch(m,g){case null:console.warn("[csstree-match] BREAK after 15000 iterations"),g="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",k=null;break;case"Match":for(;null!==u;)c();break;default:k=null}return{tokens:e,reason:g,iterations:m,match:k,longestMatch:y}}var sn=function(e,t,n){var r=on(e,t,n||{});if(null===r.match)return r;var i=r.match,a=r.match={syntax:t.syntax||null,match:[]},o=[a];for(i=tn(i).prev;null!==i;){switch(i.type){case 2:a.match.push(a={syntax:i.syntax,match:[]}),o.push(a);break;case 3:o.pop(),a=o[o.length-1];break;default:a.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node})}i=i.prev}return r};function ln(e){function t(e){return null!==e&&("Type"===e.type||"Property"===e.type||"Keyword"===e.type)}var n=null;return null!==this.matched&&function r(i){if(Array.isArray(i.match)){for(var a=0;a<i.match.length;a++)if(r(i.match[a]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return!1}(this.matched),n}function cn(e,t,n){var r=ln.call(e,t);return null!==r&&r.some(n)}var un={getTrace:ln,isType:function(e,t){return cn(this,e,(function(e){return"Type"===e.type&&e.name===t}))},isProperty:function(e,t){return cn(this,e,(function(e){return"Property"===e.type&&e.name===t}))},isKeyword:function(e){return cn(this,e,(function(e){return"Keyword"===e.type}))}};var hn={matchFragments:function(e,t,n,r,i){var o=[];return null!==n.matched&&function n(s){if(null!==s.syntax&&s.syntax.type===r&&s.syntax.name===i){var l=function e(t){return"node"in t?t.node:e(t.match[0])}(s),c=function e(t){return"node"in t?t.node:e(t.match[t.match.length-1])}(s);e.syntax.walk(t,(function(e,t,n){if(e===l){var r=new a;do{if(r.appendData(t.data),t.data===c)break;t=t.next}while(null!==t);o.push({parent:n,nodes:r})}}))}Array.isArray(s.match)&&s.match.forEach(n)}(n.matched),o}},pn=Object.prototype.hasOwnProperty;function dn(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e&&e>=0}function mn(e){return Boolean(e)&&dn(e.offset)&&dn(e.line)&&dn(e.column)}function gn(e,t){return function(n,r){if(!n||n.constructor!==Object)return r(n,"Type of node should be an Object");for(var i in n){var o=!0;if(!1!==pn.call(n,i)){if("type"===i)n.type!==e&&r(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if("loc"===i){if(null===n.loc)continue;if(n.loc&&n.loc.constructor===Object)if("string"!=typeof n.loc.source)i+=".source";else if(mn(n.loc.start)){if(mn(n.loc.end))continue;i+=".end"}else i+=".start";o=!1}else if(t.hasOwnProperty(i)){var s=0;for(o=!1;!o&&s<t[i].length;s++){var l=t[i][s];switch(l){case String:o="string"==typeof n[i];break;case Boolean:o="boolean"==typeof n[i];break;case null:o=null===n[i];break;default:"string"==typeof l?o=n[i]&&n[i].type===l:Array.isArray(l)&&(o=n[i]instanceof a)}}}else r(n,"Unknown field `"+i+"` for "+e+" node type");o||r(n,"Bad value for `"+e+"."+i+"`")}}for(var i in t)pn.call(t,i)&&!1===pn.call(n,i)&&r(n,"Field `"+e+"."+i+"` is missed")}}function fn(e,t){var n=t.structure,r={type:String,loc:!0},i={type:'"'+e+'"'};for(var a in n)if(!1!==pn.call(n,a)){for(var o=[],s=r[a]=Array.isArray(n[a])?n[a].slice():[n[a]],l=0;l<s.length;l++){var c=s[l];if(c===String||c===Boolean)o.push(c.name);else if(null===c)o.push("null");else if("string"==typeof c)o.push("<"+c+">");else{if(!Array.isArray(c))throw new Error("Wrong value `"+c+"` in `"+e+"."+a+"` structure definition");o.push("List")}}i[a]=o.join(" | ")}return{docs:i,check:gn(e,r)}}var bn=$,yn=J,kn=Qt,vn=sn,xn=function(e){var t={};if(e.node)for(var n in e.node)if(pn.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=fn(n,r)}return t},wn=kn("inherit | initial | unset"),Sn=kn("inherit | initial | unset | <-ms-legacy-expression>");function Cn(e,t,n){var r={};for(var i in e)e[i].syntax&&(r[i]=n?e[i].syntax:G(e[i].syntax,{compact:t}));return r}function zn(e,t,n){const r={};for(const[i,a]of Object.entries(e))r[i]={prelude:a.prelude&&(n?a.prelude.syntax:G(a.prelude.syntax,{compact:t})),descriptors:a.descriptors&&Cn(a.descriptors,t,n)};return r}function An(e,t,n){return{matched:e,iterations:n,error:t,getTrace:un.getTrace,isType:un.isType,isProperty:un.isProperty,isKeyword:un.isKeyword}}function Pn(e,t,n,r){var i,a=function(e,t){return"string"==typeof e?jt(e,null):t.generate(e,Mt)}(n,e.syntax);return function(e){for(var t=0;t<e.length;t++)if("var("===e[t].value.toLowerCase())return!0;return!1}(a)?An(null,new Error("Matching for a tree with var() is not supported")):(r&&(i=vn(a,e.valueCommonSyntax,e)),r&&i.match||(i=vn(a,t.match,e)).match?An(i.match,null,i.iterations):An(null,new yn(i.reason,t.syntax,n,i),i.iterations))}var Tn=function(e,t,n){if(this.valueCommonSyntax=wn,this.syntax=t,this.generic=!1,this.atrules={},this.properties={},this.types={},this.structure=n||xn(e),e){if(e.types)for(var r in e.types)this.addType_(r,e.types[r]);if(e.generic)for(var r in this.generic=!0,mt)this.addType_(r,mt[r]);if(e.atrules)for(var r in e.atrules)this.addAtrule_(r,e.atrules[r]);if(e.properties)for(var r in e.properties)this.addProperty_(r,e.properties[r])}};Tn.prototype={structure:{},checkStructure:function(e){function t(e,t){r.push({node:e,message:t})}var n=this.structure,r=[];return this.syntax.walk(e,(function(e){n.hasOwnProperty(e.type)?n[e.type].check(e,t):t(e,"Unknown node type `"+e.type+"`")})),!!r.length&&r},createDescriptor:function(e,t,n,r=null){var i={type:t,name:n},a={type:t,name:n,parent:r,syntax:null,match:null};return"function"==typeof e?a.match=kn(e,i):("string"==typeof e?Object.defineProperty(a,"syntax",{get:function(){return Object.defineProperty(a,"syntax",{value:Ot(e)}),a.syntax}}):a.syntax=e,Object.defineProperty(a,"match",{get:function(){return Object.defineProperty(a,"match",{value:kn(a.syntax,i)}),a.match}})),a},addAtrule_:function(e,t){t&&(this.atrules[e]={type:"Atrule",name:e,prelude:t.prelude?this.createDescriptor(t.prelude,"AtrulePrelude",e):null,descriptors:t.descriptors?Object.keys(t.descriptors).reduce((n,r)=>(n[r]=this.createDescriptor(t.descriptors[r],"AtruleDescriptor",r,e),n),{}):null})},addProperty_:function(e,t){t&&(this.properties[e]=this.createDescriptor(t,"Property",e))},addType_:function(e,t){t&&(this.types[e]=this.createDescriptor(t,"Type",e),t===mt["-ms-legacy-expression"]&&(this.valueCommonSyntax=Sn))},checkAtruleName:function(e){if(!this.getAtrule(e))return new bn("Unknown at-rule","@"+e)},checkAtrulePrelude:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e);return!r.prelude&&t?new SyntaxError("At-rule `@"+e+"` should not contain a prelude"):r.prelude&&!t?new SyntaxError("At-rule `@"+e+"` should contain a prelude"):void 0},checkAtruleDescriptorName:function(e,t){let n=this.checkAtruleName(e);if(n)return n;var r=this.getAtrule(e),i=ae.keyword(t);return r.descriptors?r.descriptors[i.name]||r.descriptors[i.basename]?void 0:new bn("Unknown at-rule descriptor",t):new SyntaxError("At-rule `@"+e+"` has no known descriptors")},checkPropertyName:function(e){return ae.property(e).custom?new Error("Lexer matching doesn't applicable for custom properties"):this.getProperty(e)?void 0:new bn("Unknown property",e)},matchAtrulePrelude:function(e,t){var n=this.checkAtrulePrelude(e,t);return n?An(null,n):t?Pn(this,this.getAtrule(e).prelude,t,!0):An(null,null)},matchAtruleDescriptor:function(e,t,n){var r=this.checkAtruleDescriptorName(e,t);if(r)return An(null,r);var i=this.getAtrule(e),a=ae.keyword(t);return Pn(this,i.descriptors[a.name]||i.descriptors[a.basename],n,!0)},matchDeclaration:function(e){return"Declaration"!==e.type?An(null,new Error("Not a Declaration node")):this.matchProperty(e.property,e.value)},matchProperty:function(e,t){var n=this.checkPropertyName(e);return n?An(null,n):Pn(this,this.getProperty(e),t,!0)},matchType:function(e,t){var n=this.getType(e);return n?Pn(this,n,t,!1):An(null,new bn("Unknown type",e))},match:function(e,t){return"string"==typeof e||e&&e.type?("string"!=typeof e&&e.match||(e=this.createDescriptor(e,"Type","anonymous")),Pn(this,e,t,!1)):An(null,new bn("Bad syntax"))},findValueFragments:function(e,t,n,r){return hn.matchFragments(this,t,this.matchProperty(e,t),n,r)},findDeclarationValueFragments:function(e,t,n){return hn.matchFragments(this,e.value,this.matchDeclaration(e),t,n)},findAllFragments:function(e,t,n){var r=[];return this.syntax.walk(e,{visit:"Declaration",enter:function(e){r.push.apply(r,this.findDeclarationValueFragments(e,t,n))}.bind(this)}),r},getAtrule:function(e,t=!0){var n=ae.keyword(e);return(n.vendor&&t?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null},getAtrulePrelude:function(e,t=!0){const n=this.getAtrule(e,t);return n&&n.prelude||null},getAtruleDescriptor:function(e,t){return this.atrules.hasOwnProperty(e)&&this.atrules.declarators&&this.atrules[e].declarators[t]||null},getProperty:function(e,t=!0){var n=ae.property(e);return(n.vendor&&t?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null},getType:function(e){return this.types.hasOwnProperty(e)?this.types[e]:null},validate:function(){function e(r,i,a,o){if(a.hasOwnProperty(i))return a[i];a[i]=!1,null!==o.syntax&&Nt(o.syntax,(function(o){if("Type"===o.type||"Property"===o.type){var s="Type"===o.type?r.types:r.properties,l="Type"===o.type?t:n;s.hasOwnProperty(o.name)&&!e(r,o.name,l,s[o.name])||(a[i]=!0)}}),this)}var t={},n={};for(var r in this.types)e(this,r,t,this.types[r]);for(var r in this.properties)e(this,r,n,this.properties[r]);return t=Object.keys(t).filter((function(e){return t[e]})),n=Object.keys(n).filter((function(e){return n[e]})),t.length||n.length?{types:t,properties:n}:null},dump:function(e,t){return{generic:this.generic,types:Cn(this.types,!t,e),properties:Cn(this.properties,!t,e),atrules:zn(this.atrules,!t,e)}},toString:function(){return JSON.stringify(this.dump())}};var Ln=Tn,En={SyntaxError:gt,parse:Ot,generate:G,walk:Nt},Dn=Ce.isBOM;var On=function(){this.lines=null,this.columns=null,this.linesAndColumnsComputed=!1};On.prototype={setSource:function(e,t,n,r){this.source=e,this.startOffset=void 0===t?0:t,this.startLine=void 0===n?1:n,this.startColumn=void 0===r?1:r,this.linesAndColumnsComputed=!1},ensureLinesAndColumnsComputed:function(){this.linesAndColumnsComputed||(!function(e,t){for(var n=t.length,r=se(e.lines,n),i=e.startLine,a=se(e.columns,n),o=e.startColumn,s=t.length>0?Dn(t.charCodeAt(0)):0;s<n;s++){var l=t.charCodeAt(s);r[s]=i,a[s]=o++,10!==l&&13!==l&&12!==l||(13===l&&s+1<n&&10===t.charCodeAt(s+1)&&(r[++s]=i,a[s]=o),i++,o=1)}r[s]=i,a[s]=o,e.lines=r,e.columns=a}(this,this.source),this.linesAndColumnsComputed=!0)},getLocation:function(e,t){return this.ensureLinesAndColumnsComputed(),{source:t,offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}},getLocationRange:function(e,t,n){return this.ensureLinesAndColumnsComputed(),{source:n,start:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]},end:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}}};var Bn=On,In=Ce.TYPE,Nn=In.WhiteSpace,Rn=In.Comment,Mn=function(e){var t=this.createList(),n=null,r={recognizer:e,space:null,ignoreWS:!1,ignoreWSAfter:!1};for(this.scanner.skipSC();!this.scanner.eof;){switch(this.scanner.tokenType){case Rn:this.scanner.next();continue;case Nn:r.ignoreWS?this.scanner.next():r.space=this.WhiteSpace();continue}if(void 0===(n=e.getNode.call(this,r)))break;null!==r.space&&(t.push(r.space),r.space=null),t.push(n),r.ignoreWSAfter?(r.ignoreWSAfter=!1,r.ignoreWS=!0):r.ignoreWS=!1}return t},{findWhiteSpaceStart:jn,cmpStr:_n}=M,Fn=function(){},Wn=h.TYPE,qn=h.NAME,Yn=Wn.WhiteSpace,Un=Wn.Comment,Hn=Wn.Ident,Vn=Wn.Function,Kn=Wn.Url,Gn=Wn.Hash,Qn=Wn.Percentage,Xn=Wn.Number;function Zn(e){return function(){return this[e]()}}var $n=function(e){var t={scanner:new H,locationMap:new Bn,filename:"<unknown>",needPositions:!1,onParseError:Fn,onParseErrorThrow:!1,parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Mn,createList:function(){return new a},createSingleNodeList:function(e){return(new a).appendData(e)},getFirstListNode:function(e){return e&&e.first()},getLastListNode:function(e){return e.last()},parseWithFallback:function(e,t){var n=this.scanner.tokenIndex;try{return e.call(this)}catch(e){if(this.onParseErrorThrow)throw e;var r=t.call(this,n);return this.onParseErrorThrow=!0,this.onParseError(e,r),this.onParseErrorThrow=!1,r}},lookupNonWSType:function(e){do{var t=this.scanner.lookupType(e++);if(t!==Yn)return t}while(0!==t);return 0},eat:function(e){if(this.scanner.tokenType!==e){var t=this.scanner.tokenStart,n=qn[e]+" is expected";switch(e){case Hn:this.scanner.tokenType===Vn||this.scanner.tokenType===Kn?(t=this.scanner.tokenEnd-1,n="Identifier is expected but function found"):n="Identifier is expected";break;case Gn:this.scanner.isDelim(35)&&(this.scanner.next(),t++,n="Name is expected");break;case Qn:this.scanner.tokenType===Xn&&(t=this.scanner.tokenEnd,n="Percent sign is expected");break;default:this.scanner.source.charCodeAt(this.scanner.tokenStart)===e&&(t+=1)}this.error(n,t)}this.scanner.next()},consume:function(e){var t=this.scanner.getTokenValue();return this.eat(e),t},consumeFunctionName:function(){var e=this.scanner.source.substring(this.scanner.tokenStart,this.scanner.tokenEnd-1);return this.eat(Vn),e},getLocation:function(e,t){return this.needPositions?this.locationMap.getLocationRange(e,t,this.filename):null},getLocationFromList:function(e){if(this.needPositions){var t=this.getFirstListNode(e),n=this.getLastListNode(e);return this.locationMap.getLocationRange(null!==t?t.loc.start.offset-this.locationMap.startOffset:this.scanner.tokenStart,null!==n?n.loc.end.offset-this.locationMap.startOffset:this.scanner.tokenStart,this.filename)}return null},error:function(e,t){var n=void 0!==t&&t<this.scanner.source.length?this.locationMap.getLocation(t):this.scanner.eof?this.locationMap.getLocation(jn(this.scanner.source,this.scanner.source.length-1)):this.locationMap.getLocation(this.scanner.tokenStart);throw new l(e||"Unexpected input",this.scanner.source,n.offset,n.line,n.column)}};for(var n in e=function(e){var t={context:{},scope:{},atrule:{},pseudo:{}};if(e.parseContext)for(var n in e.parseContext)switch(typeof e.parseContext[n]){case"function":t.context[n]=e.parseContext[n];break;case"string":t.context[n]=Zn(e.parseContext[n])}if(e.scope)for(var n in e.scope)t.scope[n]=e.scope[n];if(e.atrule)for(var n in e.atrule){var r=e.atrule[n];r.parse&&(t.atrule[n]=r.parse)}if(e.pseudo)for(var n in e.pseudo){var i=e.pseudo[n];i.parse&&(t.pseudo[n]=i.parse)}if(e.node)for(var n in e.node)t[n]=e.node[n].parse;return t}(e||{}))t[n]=e[n];return function(e,n){var r,i=(n=n||{}).context||"default",a=n.onComment;if(Ce(e,t.scanner),t.locationMap.setSource(e,n.offset,n.line,n.column),t.filename=n.filename||"<unknown>",t.needPositions=Boolean(n.positions),t.onParseError="function"==typeof n.onParseError?n.onParseError:Fn,t.onParseErrorThrow=!1,t.parseAtrulePrelude=!("parseAtrulePrelude"in n)||Boolean(n.parseAtrulePrelude),t.parseRulePrelude=!("parseRulePrelude"in n)||Boolean(n.parseRulePrelude),t.parseValue=!("parseValue"in n)||Boolean(n.parseValue),t.parseCustomProperty="parseCustomProperty"in n&&Boolean(n.parseCustomProperty),!t.context.hasOwnProperty(i))throw new Error("Unknown context `"+i+"`");return"function"==typeof a&&t.scanner.forEachToken((n,r,i)=>{if(n===Un){const n=t.getLocation(r,i),o=_n(e,i-2,i,"*/")?e.slice(r+2,i-2):e.slice(r+2,i);a(o,n)}}),r=t.context[i].call(t,n),t.scanner.eof||t.error(),r}},Jn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),er=function(e){if(0<=e&&e<Jn.length)return Jn[e];throw new TypeError("Must be between 0 and 63: "+e)};var tr=function(e){var t,n="",r=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&r,(r>>>=5)>0&&(t|=32),n+=er(t)}while(r>0);return n};var nr=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function a(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function o(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path}for(var o,s=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(o=l[u])?l.splice(u,1):".."===o?c++:c>0&&(""===o?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=s?"/":"."),r?(r.path=n,a(r)):n}function s(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),s=i(e);if(s&&(e=s.path||"/"),n&&!n.scheme)return s&&(n.scheme=s.scheme),a(n);if(n||t.match(r))return t;if(s&&!s.host&&!s.path)return s.host=t,a(s);var l="/"===t.charAt(0)?t:o(e.replace(/\/+$/,"")+"/"+t);return s?(s.path=l,a(s)):l}t.urlParse=i,t.urlGenerate=a,t.normalize=o,t.join=s,t.isAbsolute=function(e){return"/"===e.charAt(0)||n.test(e)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var l=!("__proto__"in Object.create(null));function c(e){return e}function u(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function h(e,t){return e===t?0:null===e?1:null===t?-1:e>t?1:-1}t.toSetString=l?c:function(e){return u(e)?"$"+e:e},t.fromSetString=l?c:function(e){return u(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=h(e.source,t.source);return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:h(e.name,t.name)},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=h(e.source,t.source))||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:h(e.name,t.name)},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=h(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:h(e.name,t.name)},t.parseSourceMapInput=function(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))},t.computeSourceURL=function(e,t,n){if(t=t||"",e&&("/"!==e[e.length-1]&&"/"!==t[0]&&(e+="/"),t=e+t),n){var r=i(n);if(!r)throw new Error("sourceMapURL could not be parsed");if(r.path){var l=r.path.lastIndexOf("/");l>=0&&(r.path=r.path.substring(0,l+1))}t=s(a(r),t)}return o(t)}})),rr=(nr.getArg,nr.urlParse,nr.urlGenerate,nr.normalize,nr.join,nr.isAbsolute,nr.relative,nr.toSetString,nr.fromSetString,nr.compareByOriginalPositions,nr.compareByGeneratedPositionsDeflated,nr.compareByGeneratedPositionsInflated,nr.parseSourceMapInput,nr.computeSourceURL,Object.prototype.hasOwnProperty),ir="undefined"!=typeof Map;function ar(){this._array=[],this._set=ir?new Map:Object.create(null)}ar.fromArray=function(e,t){for(var n=new ar,r=0,i=e.length;r<i;r++)n.add(e[r],t);return n},ar.prototype.size=function(){return ir?this._set.size:Object.getOwnPropertyNames(this._set).length},ar.prototype.add=function(e,t){var n=ir?e:nr.toSetString(e),r=ir?this.has(e):rr.call(this._set,n),i=this._array.length;r&&!t||this._array.push(e),r||(ir?this._set.set(e,i):this._set[n]=i)},ar.prototype.has=function(e){if(ir)return this._set.has(e);var t=nr.toSetString(e);return rr.call(this._set,t)},ar.prototype.indexOf=function(e){if(ir){var t=this._set.get(e);if(t>=0)return t}else{var n=nr.toSetString(e);if(rr.call(this._set,n))return this._set[n]}throw new Error('"'+e+'" is not in the set.')},ar.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},ar.prototype.toArray=function(){return this._array.slice()};var or={ArraySet:ar};function sr(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}sr.prototype.unsortedForEach=function(e,t){this._array.forEach(e,t)},sr.prototype.add=function(e){var t,n,r,i,a,o;t=this._last,n=e,r=t.generatedLine,i=n.generatedLine,a=t.generatedColumn,o=n.generatedColumn,i>r||i==r&&o>=a||nr.compareByGeneratedPositionsInflated(t,n)<=0?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},sr.prototype.toArray=function(){return this._sorted||(this._array.sort(nr.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};var lr=or.ArraySet,cr={MappingList:sr}.MappingList;function ur(e){e||(e={}),this._file=nr.getArg(e,"file",null),this._sourceRoot=nr.getArg(e,"sourceRoot",null),this._skipValidation=nr.getArg(e,"skipValidation",!1),this._sources=new lr,this._names=new lr,this._mappings=new cr,this._sourcesContents=null}ur.prototype._version=3,ur.fromSourceMap=function(e){var t=e.sourceRoot,n=new ur({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=nr.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(r){var i=r;null!==t&&(i=nr.relative(t,r)),n._sources.has(i)||n._sources.add(i);var a=e.sourceContentFor(r);null!=a&&n.setSourceContent(r,a)})),n},ur.prototype.addMapping=function(e){var t=nr.getArg(e,"generated"),n=nr.getArg(e,"original",null),r=nr.getArg(e,"source",null),i=nr.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,i),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:i})},ur.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=nr.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[nr.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[nr.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},ur.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var i=this._sourceRoot;null!=i&&(r=nr.relative(i,r));var a=new lr,o=new lr;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var s=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=s.source&&(t.source=s.source,null!=n&&(t.source=nr.join(n,t.source)),null!=i&&(t.source=nr.relative(i,t.source)),t.originalLine=s.line,t.originalColumn=s.column,null!=s.name&&(t.name=s.name))}var l=t.source;null==l||a.has(l)||a.add(l);var c=t.name;null==c||o.has(c)||o.add(c)}),this),this._sources=a,this._names=o,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=nr.join(n,t)),null!=i&&(t=nr.relative(i,t)),this.setSourceContent(t,r))}),this)},ur.prototype._validateMapping=function(e,t,n,r){if(t&&"number"!=typeof t.line&&"number"!=typeof t.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},ur.prototype._serializeMappings=function(){for(var e,t,n,r,i=0,a=1,o=0,s=0,l=0,c=0,u="",h=this._mappings.toArray(),p=0,d=h.length;p<d;p++){if(e="",(t=h[p]).generatedLine!==a)for(i=0;t.generatedLine!==a;)e+=";",a++;else if(p>0){if(!nr.compareByGeneratedPositionsInflated(t,h[p-1]))continue;e+=","}e+=tr(t.generatedColumn-i),i=t.generatedColumn,null!=t.source&&(r=this._sources.indexOf(t.source),e+=tr(r-c),c=r,e+=tr(t.originalLine-1-s),s=t.originalLine-1,e+=tr(t.originalColumn-o),o=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=tr(n-l),l=n)),u+=e}return u},ur.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=nr.relative(t,e));var n=nr.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},ur.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},ur.prototype.toString=function(){return JSON.stringify(this.toJSON())};var hr={SourceMapGenerator:ur}.SourceMapGenerator,pr={Atrule:!0,Selector:!0,Declaration:!0},dr=Object.prototype.hasOwnProperty;function mr(e,t){var n=e.children,r=null;"function"!=typeof t?n.forEach(this.node,this):n.forEach((function(e){null!==r&&t.call(this,r),this.node(e),r=e}),this)}var gr=function(e){function t(e){if(!dr.call(n,e.type))throw new Error("Unknown node type: "+e.type);n[e.type].call(this,e)}var n={};if(e.node)for(var r in e.node)n[r]=e.node[r].generate;return function(e,n){var r="",i={children:mr,node:t,chunk:function(e){r+=e},result:function(){return r}};return n&&("function"==typeof n.decorator&&(i=n.decorator(i)),n.sourceMap&&(i=function(e){var t=new hr,n=1,r=0,i={line:1,column:0},a={line:0,column:0},o=!1,s={line:1,column:0},l={generated:s},c=e.node;e.node=function(e){if(e.loc&&e.loc.start&&pr.hasOwnProperty(e.type)){var u=e.loc.start.line,h=e.loc.start.column-1;a.line===u&&a.column===h||(a.line=u,a.column=h,i.line=n,i.column=r,o&&(o=!1,i.line===s.line&&i.column===s.column||t.addMapping(l)),o=!0,t.addMapping({source:e.loc.source,original:a,generated:i}))}c.call(this,e),o&&pr.hasOwnProperty(e.type)&&(s.line=n,s.column=r)};var u=e.chunk;e.chunk=function(e){for(var t=0;t<e.length;t++)10===e.charCodeAt(t)?(n++,r=0):r++;u(e)};var h=e.result;return e.result=function(){return o&&t.addMapping(l),{css:h(),map:t}},e}(i))),i.node(e),i.result()}},fr=Object.prototype.hasOwnProperty,br=function(){};function yr(e){return"function"==typeof e?e:br}function kr(e,t){return function(n,r,i){n.type===t&&e.call(this,n,r,i)}}function vr(e,t){var n=t.structure,r=[];for(var i in n)if(!1!==fr.call(n,i)){var a=n[i],o={name:i,type:!1,nullable:!1};Array.isArray(n[i])||(a=[n[i]]);for(var s=0;s<a.length;s++){var l=a[s];null===l?o.nullable=!0:"string"==typeof l?o.type="node":Array.isArray(l)&&(o.type="list")}o.type&&r.push(o)}return r.length?{context:t.walkContext,fields:r}:null}function xr(e,t){var n=e.fields.slice(),r=e.context,i="string"==typeof r;return t&&n.reverse(),function(e,a,o,s){var l;i&&(l=a[r],a[r]=e);for(var c=0;c<n.length;c++){var u=n[c],h=e[u.name];if(!u.nullable||h)if("list"===u.type){if(t?h.reduceRight(s,!1):h.reduce(s,!1))return!0}else if(o(h))return!0}i&&(a[r]=l)}}function wr(e){return{Atrule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Rule:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block},Declaration:{StyleSheet:e.StyleSheet,Atrule:e.Atrule,Rule:e.Rule,Block:e.Block,DeclarationList:e.DeclarationList}}}var Sr=function(e){var t=function(e){var t={};for(var n in e.node)if(fr.call(e.node,n)){var r=e.node[n];if(!r.structure)throw new Error("Missed `structure` field in `"+n+"` node type definition");t[n]=vr(0,r)}return t}(e),n={},r={},i=Symbol("break-walk"),a=Symbol("skip-node");for(var o in t)fr.call(t,o)&&null!==t[o]&&(n[o]=xr(t[o],!1),r[o]=xr(t[o],!0));var s=wr(n),l=wr(r),c=function(e,o){function c(e,t,n){var r=h.call(m,e,t,n);return r===i||r!==a&&(!(!d.hasOwnProperty(e.type)||!d[e.type](e,m,c,u))||p.call(m,e,t,n)===i)}var u=(e,t,n,r)=>e||c(t,n,r),h=br,p=br,d=n,m={break:i,skip:a,root:e,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if("function"==typeof o)h=o;else if(o&&(h=yr(o.enter),p=yr(o.leave),o.reverse&&(d=r),o.visit)){if(s.hasOwnProperty(o.visit))d=o.reverse?l[o.visit]:s[o.visit];else if(!t.hasOwnProperty(o.visit))throw new Error("Bad value `"+o.visit+"` for `visit` option (should be: "+Object.keys(t).join(", ")+")");h=kr(h,o.visit),p=kr(p,o.visit)}if(h===br&&p===br)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");c(e)};return c.break=i,c.skip=a,c.find=function(e,t){var n=null;return c(e,(function(e,r,a){if(t.call(this,e,r,a))return n=e,i})),n},c.findLast=function(e,t){var n=null;return c(e,{reverse:!0,enter:function(e,r,a){if(t.call(this,e,r,a))return n=e,i}}),n},c.findAll=function(e,t){var n=[];return c(e,(function(e,r,i){t.call(this,e,r,i)&&n.push(e)})),n},c},Cr=function e(t){var n={};for(var r in t){var i=t[r];i&&(Array.isArray(i)||i instanceof a?i=i.map(e):i.constructor===Object&&(i=e(i))),n[r]=i}return n};const zr=Object.prototype.hasOwnProperty,Ar={generic:!0,types:Er,atrules:{prelude:Dr,descriptors:Dr},properties:Er,parseContext:function(e,t){return Object.assign(e,t)},scope:function e(t,n){for(const r in n)zr.call(n,r)&&(Pr(t[r])?e(t[r],Tr(n[r])):t[r]=Tr(n[r]));return t},atrule:["parse"],pseudo:["parse"],node:["name","structure","parse","generate","walkContext"]};function Pr(e){return e&&e.constructor===Object}function Tr(e){return Pr(e)?Object.assign({},e):e}function Lr(e,t){return"string"==typeof t&&/^\s*\|/.test(t)?"string"==typeof e?e+t:t.replace(/^\s*\|\s*/,""):t||null}function Er(e,t){if("string"==typeof t)return Lr(e,t);const n=Object.assign({},e);for(let r in t)zr.call(t,r)&&(n[r]=Lr(zr.call(e,r)?e[r]:void 0,t[r]));return n}function Dr(e,t){const n=Er(e,t);return!Pr(n)||Object.keys(n).length?n:null}var Or=(e,t)=>function e(t,n,r){for(const i in r)if(!1!==zr.call(r,i))if(!0===r[i])i in n&&zr.call(n,i)&&(t[i]=Tr(n[i]));else if(r[i])if("function"==typeof r[i]){const e=r[i];t[i]=e({},t[i]),t[i]=e(t[i]||{},n[i])}else if(Pr(r[i])){const a={};for(let n in t[i])a[n]=e({},t[i][n],r[i]);for(let t in n[i])a[t]=e(a[t]||{},n[i][t],r[i]);t[i]=a}else if(Array.isArray(r[i])){const a={},o=r[i].reduce((function(e,t){return e[t]=!0,e}),{});for(const[n,r]of Object.entries(t[i]||{}))a[n]={},r&&e(a[n],r,o);for(const t in n[i])zr.call(n[i],t)&&(a[t]||(a[t]={}),n[i]&&n[i][t]&&e(a[t],n[i][t],o));t[i]=a}return t}(e,t,Ar);function Br(e){var t=$n(e),n=Sr(e),r=gr(e),i=function(e){return{fromPlainObject:function(t){return e(t,{enter:function(e){e.children&&e.children instanceof a==!1&&(e.children=(new a).fromArray(e.children))}}),t},toPlainObject:function(t){return e(t,{leave:function(e){e.children&&e.children instanceof a&&(e.children=e.children.toArray())}}),t}}}(n),o={List:a,SyntaxError:l,TokenStream:H,Lexer:Ln,vendorPrefix:ae.vendorPrefix,keyword:ae.keyword,property:ae.property,isCustomProperty:ae.isCustomProperty,definitionSyntax:En,lexer:null,createLexer:function(e){return new Ln(e,o,o.lexer.structure)},tokenize:Ce,parse:t,walk:n,generate:r,find:n.find,findLast:n.findLast,findAll:n.findAll,clone:Cr,fromPlainObject:i.fromPlainObject,toPlainObject:i.toPlainObject,createSyntax:function(e){return Br(Or({},e))},fork:function(t){var n=Or({},e);return Br("function"==typeof t?t(n,Object.assign):Or(n,t))}};return o.lexer=new Ln({generic:!0,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},o),o}var Ir=function(e){return Br(Or({},e))},Nr={generic:!0,types:{"absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|( <calc-sum> )","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<quote>|<target>|<leader()>|<attr()>|counter( <ident> , <'list-style-type'>? )]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","counter()":"counter( <custom-ident> , <counter-style>? )","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <custom-ident> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fit-content()":"fit-content( [<length>|<percentage>] )","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] <resolution>","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length>|<percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length>|<percentage>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( <length> )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","saturate()":"saturate( <number-percentage> )","scale()":"scale( <number> , <number>? )","scale3d()":"scale3d( <number> , <number> , <number> )","scaleX()":"scaleX( <number> )","scaleY()":"scaleY( <number> )","scaleZ()":"scaleZ( <number> )","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","single-animation":"<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-transition":"[none|<single-transition-property>]||<time>||<timing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","border-radius":"<length-percentage>{1,2}",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#","name-repeat":"repeat( [<positive-integer>|auto-fill] , <line-names>+ )",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger",ratio:"<integer> / <integer>",right:"<length>|auto","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto","track-group":"'(' [<string>* <track-minmax> <string>*]+ ')' ['[' <positive-integer> ']']?|<track-minmax>","track-list-v0":"[<string>* <track-group> <string>*]+|none","track-minmax":"minmax( <track-breadth> , <track-breadth> )|auto|<track-breadth>|fit-content",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,∞]>","positive-integer":"<integer [0,∞]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"<integer [0,1]>","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<'color'>","-webkit-border-before-color":"<'color'>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert",animation:"<single-animation>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<timing-function>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<box>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<'color'>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end","caret-color":"auto|<color>",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","color-adjust":"economy|exact","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[size||layout||style||paint]",content:"normal|none|[<content-replacement>|<content-list>] [/ <string>]?","counter-increment":"[<custom-ident> <integer>?]+|none","counter-reset":"[<custom-ident> <integer>?]+|none","counter-set":"[<custom-ident> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|<number>","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<url>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length-percentage>|min-content|max-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"over|under|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|dark|light|<color>{2}","scrollbar-gutter":"auto|[stable|always]&&both?&&force?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|<shape-box>||<basic-shape>|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<timing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content( <length-percentage> )","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length-percentage>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [<media-query-list>]?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}}}},Rr=Ce.cmpChar,Mr=Ce.isDigit,jr=Ce.TYPE,_r=jr.WhiteSpace,Fr=jr.Comment,Wr=jr.Ident,qr=jr.Number,Yr=jr.Dimension;function Ur(e,t){var n=this.scanner.tokenStart+e,r=this.scanner.source.charCodeAt(n);for(43!==r&&45!==r||(t&&this.error("Number sign is not allowed"),n++);n<this.scanner.tokenEnd;n++)Mr(this.scanner.source.charCodeAt(n))||this.error("Integer is expected",n)}function Hr(e){return Ur.call(this,0,e)}function Vr(e,t){if(!Rr(this.scanner.source,this.scanner.tokenStart+e,t)){var n="";switch(t){case 110:n="N is expected";break;case 45:n="HyphenMinus is expected"}this.error(n,this.scanner.tokenStart+e)}}function Kr(){for(var e=0,t=0,n=this.scanner.tokenType;n===_r||n===Fr;)n=this.scanner.lookupType(++e);if(n!==qr){if(!this.scanner.isDelim(43,e)&&!this.scanner.isDelim(45,e))return null;t=this.scanner.isDelim(43,e)?43:45;do{n=this.scanner.lookupType(++e)}while(n===_r||n===Fr);n!==qr&&(this.scanner.skip(e),Hr.call(this,!0))}return e>0&&this.scanner.skip(e),0===t&&43!==(n=this.scanner.source.charCodeAt(this.scanner.tokenStart))&&45!==n&&this.error("Number sign is expected"),Hr.call(this,0!==t),45===t?"-"+this.consume(qr):this.consume(qr)}var Gr={name:"AnPlusB",structure:{a:[String,null],b:[String,null]},parse:function(){var e=this.scanner.tokenStart,t=null,n=null;if(this.scanner.tokenType===qr)Hr.call(this,!1),n=this.consume(qr);else if(this.scanner.tokenType===Wr&&Rr(this.scanner.source,this.scanner.tokenStart,45))switch(t="-1",Vr.call(this,1,110),this.scanner.getTokenLength()){case 2:this.scanner.next(),n=Kr.call(this);break;case 3:Vr.call(this,2,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,2,45),Ur.call(this,3,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+2)}else if(this.scanner.tokenType===Wr||this.scanner.isDelim(43)&&this.scanner.lookupType(1)===Wr){var r=0;switch(t="1",this.scanner.isDelim(43)&&(r=1,this.scanner.next()),Vr.call(this,0,110),this.scanner.getTokenLength()){case 1:this.scanner.next(),n=Kr.call(this);break;case 2:Vr.call(this,1,45),this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr);break;default:Vr.call(this,1,45),Ur.call(this,2,!0),this.scanner.next(),n=this.scanner.substrToCursor(e+r+1)}}else if(this.scanner.tokenType===Yr){for(var i=this.scanner.source.charCodeAt(this.scanner.tokenStart),a=(r=43===i||45===i,this.scanner.tokenStart+r);a<this.scanner.tokenEnd&&Mr(this.scanner.source.charCodeAt(a));a++);a===this.scanner.tokenStart+r&&this.error("Integer is expected",this.scanner.tokenStart+r),Vr.call(this,a-this.scanner.tokenStart,110),t=this.scanner.source.substring(e,a),a+1===this.scanner.tokenEnd?(this.scanner.next(),n=Kr.call(this)):(Vr.call(this,a-this.scanner.tokenStart+1,45),a+2===this.scanner.tokenEnd?(this.scanner.next(),this.scanner.skipSC(),Hr.call(this,!0),n="-"+this.consume(qr)):(Ur.call(this,a-this.scanner.tokenStart+2,!0),this.scanner.next(),n=this.scanner.substrToCursor(a+1)))}else this.error();return null!==t&&43===t.charCodeAt(0)&&(t=t.substr(1)),null!==n&&43===n.charCodeAt(0)&&(n=n.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.scanner.tokenStart),a:t,b:n}},generate:function(e){var t=null!==e.a&&void 0!==e.a,n=null!==e.b&&void 0!==e.b;t?(this.chunk("+1"===e.a?"+n":"1"===e.a?"n":"-1"===e.a?"-n":e.a+"n"),n&&("-"===(n=String(e.b)).charAt(0)||"+"===n.charAt(0)?(this.chunk(n.charAt(0)),this.chunk(n.substr(1))):(this.chunk("+"),this.chunk(n)))):this.chunk(String(e.b))}},Qr=Ce.TYPE,Xr=Qr.WhiteSpace,Zr=Qr.Semicolon,$r=Qr.LeftCurlyBracket,Jr=Qr.Delim;function ei(){return this.scanner.tokenIndex>0&&this.scanner.lookupType(-1)===Xr?this.scanner.tokenIndex>1?this.scanner.getTokenStart(this.scanner.tokenIndex-1):this.scanner.firstCharOffset:this.scanner.tokenStart}function ti(){return 0}var ni={name:"Raw",structure:{value:String},parse:function(e,t,n){var r,i=this.scanner.getTokenStart(e);return this.scanner.skip(this.scanner.getRawLength(e,t||ti)),r=n&&this.scanner.tokenStart>i?ei.call(this):this.scanner.tokenStart,{type:"Raw",loc:this.getLocation(i,r),value:this.scanner.source.substring(i,r)}},generate:function(e){this.chunk(e.value)},mode:{default:ti,leftCurlyBracket:function(e){return e===$r?1:0},leftCurlyBracketOrSemicolon:function(e){return e===$r||e===Zr?1:0},exclamationMarkOrSemicolon:function(e,t,n){return e===Jr&&33===t.charCodeAt(n)||e===Zr?1:0},semicolonIncluded:function(e){return e===Zr?2:0}}},ri=Ce.TYPE,ii=ni.mode,ai=ri.AtKeyword,oi=ri.Semicolon,si=ri.LeftCurlyBracket,li=ri.RightCurlyBracket;function ci(e){return this.Raw(e,ii.leftCurlyBracketOrSemicolon,!0)}function ui(){for(var e,t=1;e=this.scanner.lookupType(t);t++){if(e===li)return!0;if(e===si||e===ai)return!1}return!1}var hi={name:"Atrule",structure:{name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null,i=null;switch(this.eat(ai),t=(e=this.scanner.substrToCursor(n+1)).toLowerCase(),this.scanner.skipSC(),!1===this.scanner.eof&&this.scanner.tokenType!==si&&this.scanner.tokenType!==oi&&(this.parseAtrulePrelude?"AtrulePrelude"===(r=this.parseWithFallback(this.AtrulePrelude.bind(this,e),ci)).type&&null===r.children.head&&(r=null):r=ci.call(this,this.scanner.tokenIndex),this.scanner.skipSC()),this.scanner.tokenType){case oi:this.scanner.next();break;case si:i=this.atrule.hasOwnProperty(t)&&"function"==typeof this.atrule[t].block?this.atrule[t].block.call(this):this.Block(ui.call(this))}return{type:"Atrule",loc:this.getLocation(n,this.scanner.tokenStart),name:e,prelude:r,block:i}},generate:function(e){this.chunk("@"),this.chunk(e.name),null!==e.prelude&&(this.chunk(" "),this.node(e.prelude)),e.block?this.node(e.block):this.chunk(";")},walkContext:"atrule"},pi=Ce.TYPE,di=pi.Semicolon,mi=pi.LeftCurlyBracket,gi={name:"AtrulePrelude",structure:{children:[[]]},parse:function(e){var t=null;return null!==e&&(e=e.toLowerCase()),this.scanner.skipSC(),t=this.atrule.hasOwnProperty(e)&&"function"==typeof this.atrule[e].prelude?this.atrule[e].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.scanner.skipSC(),!0!==this.scanner.eof&&this.scanner.tokenType!==mi&&this.scanner.tokenType!==di&&this.error("Semicolon or block is expected"),null===t&&(t=this.createList()),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e)},walkContext:"atrulePrelude"},fi=Ce.TYPE,bi=fi.Ident,yi=fi.String,ki=fi.Colon,vi=fi.LeftSquareBracket,xi=fi.RightSquareBracket;function wi(){this.scanner.eof&&this.error("Unexpected end of input");var e=this.scanner.tokenStart,t=!1,n=!0;return this.scanner.isDelim(42)?(t=!0,n=!1,this.scanner.next()):this.scanner.isDelim(124)||this.eat(bi),this.scanner.isDelim(124)?61!==this.scanner.source.charCodeAt(this.scanner.tokenStart+1)?(this.scanner.next(),this.eat(bi)):t&&this.error("Identifier is expected",this.scanner.tokenEnd):t&&this.error("Vertical line is expected"),n&&this.scanner.tokenType===ki&&(this.scanner.next(),this.eat(bi)),{type:"Identifier",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}}function Si(){var e=this.scanner.tokenStart,t=this.scanner.source.charCodeAt(e);return 61!==t&&126!==t&&94!==t&&36!==t&&42!==t&&124!==t&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.scanner.next(),61!==t&&(this.scanner.isDelim(61)||this.error("Equal sign is expected"),this.scanner.next()),this.scanner.substrToCursor(e)}var Ci={name:"AttributeSelector",structure:{name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]},parse:function(){var e,t=this.scanner.tokenStart,n=null,r=null,i=null;return this.eat(vi),this.scanner.skipSC(),e=wi.call(this),this.scanner.skipSC(),this.scanner.tokenType!==xi&&(this.scanner.tokenType!==bi&&(n=Si.call(this),this.scanner.skipSC(),r=this.scanner.tokenType===yi?this.String():this.Identifier(),this.scanner.skipSC()),this.scanner.tokenType===bi&&(i=this.scanner.getTokenValue(),this.scanner.next(),this.scanner.skipSC())),this.eat(xi),{type:"AttributeSelector",loc:this.getLocation(t,this.scanner.tokenStart),name:e,matcher:n,value:r,flags:i}},generate:function(e){var t=" ";this.chunk("["),this.node(e.name),null!==e.matcher&&(this.chunk(e.matcher),null!==e.value&&(this.node(e.value),"String"===e.value.type&&(t=""))),null!==e.flags&&(this.chunk(t),this.chunk(e.flags)),this.chunk("]")}},zi=Ce.TYPE,Ai=ni.mode,Pi=zi.WhiteSpace,Ti=zi.Comment,Li=zi.Semicolon,Ei=zi.AtKeyword,Di=zi.LeftCurlyBracket,Oi=zi.RightCurlyBracket;function Bi(e){return this.Raw(e,null,!0)}function Ii(){return this.parseWithFallback(this.Rule,Bi)}function Ni(e){return this.Raw(e,Ai.semicolonIncluded,!0)}function Ri(){if(this.scanner.tokenType===Li)return Ni.call(this,this.scanner.tokenIndex);var e=this.parseWithFallback(this.Declaration,Ni);return this.scanner.tokenType===Li&&this.scanner.next(),e}var Mi={name:"Block",structure:{children:[["Atrule","Rule","Declaration"]]},parse:function(e){var t=e?Ri:Ii,n=this.scanner.tokenStart,r=this.createList();this.eat(Di);e:for(;!this.scanner.eof;)switch(this.scanner.tokenType){case Oi:break e;case Pi:case Ti:this.scanner.next();break;case Ei:r.push(this.parseWithFallback(this.Atrule,Bi));break;default:r.push(t.call(this))}return this.scanner.eof||this.eat(Oi),{type:"Block",loc:this.getLocation(n,this.scanner.tokenStart),children:r}},generate:function(e){this.chunk("{"),this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")})),this.chunk("}")},walkContext:"block"},ji=Ce.TYPE,_i=ji.LeftSquareBracket,Fi=ji.RightSquareBracket,Wi={name:"Brackets",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat(_i),n=e.call(this,t),this.scanner.eof||this.eat(Fi),{type:"Brackets",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("["),this.children(e),this.chunk("]")}},qi=Ce.TYPE.CDC,Yi={name:"CDC",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(qi),{type:"CDC",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("--\x3e")}},Ui=Ce.TYPE.CDO,Hi={name:"CDO",structure:[],parse:function(){var e=this.scanner.tokenStart;return this.eat(Ui),{type:"CDO",loc:this.getLocation(e,this.scanner.tokenStart)}},generate:function(){this.chunk("\x3c!--")}},Vi=Ce.TYPE.Ident,Ki={name:"ClassSelector",structure:{name:String},parse:function(){return this.scanner.isDelim(46)||this.error("Full stop is expected"),this.scanner.next(),{type:"ClassSelector",loc:this.getLocation(this.scanner.tokenStart-1,this.scanner.tokenEnd),name:this.consume(Vi)}},generate:function(e){this.chunk("."),this.chunk(e.name)}},Gi=Ce.TYPE.Ident,Qi={name:"Combinator",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 62:case 43:case 126:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.tokenType===Gi&&!1!==this.scanner.lookupValue(0,"deep")||this.error("Identifier `deep` is expected"),this.scanner.next(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.scanner.next();break;default:this.error("Combinator is expected")}return{type:"Combinator",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Xi=Ce.TYPE.Comment,Zi={name:"Comment",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=this.scanner.tokenEnd;return this.eat(Xi),t-e+2>=2&&42===this.scanner.source.charCodeAt(t-2)&&47===this.scanner.source.charCodeAt(t-1)&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e+2,t)}},generate:function(e){this.chunk("/*"),this.chunk(e.value),this.chunk("*/")}},$i=ae.isCustomProperty,Ji=Ce.TYPE,ea=ni.mode,ta=Ji.Ident,na=Ji.Hash,ra=Ji.Colon,ia=Ji.Semicolon,aa=Ji.Delim,oa=Ji.WhiteSpace;function sa(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!0)}function la(e){return this.Raw(e,ea.exclamationMarkOrSemicolon,!1)}function ca(){var e=this.scanner.tokenIndex,t=this.Value();return"Raw"!==t.type&&!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isDelim(33)&&!1===this.scanner.isBalanceEdge(e)&&this.error(),t}var ua={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var e,t=this.scanner.tokenStart,n=this.scanner.tokenIndex,r=ha.call(this),i=$i(r),a=i?this.parseCustomProperty:this.parseValue,o=i?la:sa,s=!1;this.scanner.skipSC(),this.eat(ra);const l=this.scanner.tokenIndex;if(i||this.scanner.skipSC(),e=a?this.parseWithFallback(ca,o):o.call(this,this.scanner.tokenIndex),i&&"Value"===e.type&&e.children.isEmpty())for(let t=l-this.scanner.tokenIndex;t<=0;t++)if(this.scanner.lookupType(t)===oa){e.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}return this.scanner.isDelim(33)&&(s=pa.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==ia&&!1===this.scanner.isBalanceEdge(n)&&this.error(),{type:"Declaration",loc:this.getLocation(t,this.scanner.tokenStart),important:s,property:r,value:e}},generate:function(e){this.chunk(e.property),this.chunk(":"),this.node(e.value),e.important&&this.chunk(!0===e.important?"!important":"!"+e.important)},walkContext:"declaration"};function ha(){var e=this.scanner.tokenStart;if(this.scanner.tokenType===aa)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 42:case 36:case 43:case 35:case 38:this.scanner.next();break;case 47:this.scanner.next(),this.scanner.isDelim(47)&&this.scanner.next()}return this.scanner.tokenType===na?this.eat(na):this.eat(ta),this.scanner.substrToCursor(e)}function pa(){this.eat(aa),this.scanner.skipSC();var e=this.consume(ta);return"important"===e||e}var da=Ce.TYPE,ma=ni.mode,ga=da.WhiteSpace,fa=da.Comment,ba=da.Semicolon;function ya(e){return this.Raw(e,ma.semicolonIncluded,!0)}var ka={name:"DeclarationList",structure:{children:[["Declaration"]]},parse:function(){for(var e=this.createList();!this.scanner.eof;)switch(this.scanner.tokenType){case ga:case fa:case ba:this.scanner.next();break;default:e.push(this.parseWithFallback(this.Declaration,ya))}return{type:"DeclarationList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(e){"Declaration"===e.type&&this.chunk(";")}))}},va=M.consumeNumber,xa=Ce.TYPE.Dimension,wa={name:"Dimension",structure:{value:String,unit:String},parse:function(){var e=this.scanner.tokenStart,t=va(this.scanner.source,e);return this.eat(xa),{type:"Dimension",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t),unit:this.scanner.source.substring(t,this.scanner.tokenStart)}},generate:function(e){this.chunk(e.value),this.chunk(e.unit)}},Sa=Ce.TYPE.RightParenthesis,Ca={name:"Function",structure:{name:String,children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart,i=this.consumeFunctionName(),a=i.toLowerCase();return n=t.hasOwnProperty(a)?t[a].call(this,t):e.call(this,t),this.scanner.eof||this.eat(Sa),{type:"Function",loc:this.getLocation(r,this.scanner.tokenStart),name:i,children:n}},generate:function(e){this.chunk(e.name),this.chunk("("),this.children(e),this.chunk(")")},walkContext:"function"},za=Ce.TYPE.Hash,Aa={name:"Hash",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(za),{type:"Hash",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.value)}},Pa=Ce.TYPE.Ident,Ta={name:"Identifier",structure:{name:String},parse:function(){return{type:"Identifier",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),name:this.consume(Pa)}},generate:function(e){this.chunk(e.name)}},La=Ce.TYPE.Hash,Ea={name:"IdSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.eat(La),{type:"IdSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e+1)}},generate:function(e){this.chunk("#"),this.chunk(e.name)}},Da=Ce.TYPE,Oa=Da.Ident,Ba=Da.Number,Ia=Da.Dimension,Na=Da.LeftParenthesis,Ra=Da.RightParenthesis,Ma=Da.Colon,ja=Da.Delim,_a={name:"MediaFeature",structure:{name:String,value:["Identifier","Number","Dimension","Ratio",null]},parse:function(){var e,t=this.scanner.tokenStart,n=null;if(this.eat(Na),this.scanner.skipSC(),e=this.consume(Oa),this.scanner.skipSC(),this.scanner.tokenType!==Ra){switch(this.eat(Ma),this.scanner.skipSC(),this.scanner.tokenType){case Ba:n=this.lookupNonWSType(1)===ja?this.Ratio():this.Number();break;case Ia:n=this.Dimension();break;case Oa:n=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected")}this.scanner.skipSC()}return this.eat(Ra),{type:"MediaFeature",loc:this.getLocation(t,this.scanner.tokenStart),name:e,value:n}},generate:function(e){this.chunk("("),this.chunk(e.name),null!==e.value&&(this.chunk(":"),this.node(e.value)),this.chunk(")")}},Fa=Ce.TYPE,Wa=Fa.WhiteSpace,qa=Fa.Comment,Ya=Fa.Ident,Ua=Fa.LeftParenthesis,Ha={name:"MediaQuery",structure:{children:[["Identifier","MediaFeature","WhiteSpace"]]},parse:function(){this.scanner.skipSC();var e=this.createList(),t=null,n=null;e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case qa:this.scanner.next();continue;case Wa:n=this.WhiteSpace();continue;case Ya:t=this.Identifier();break;case Ua:t=this.MediaFeature();break;default:break e}null!==n&&(e.push(n),n=null),e.push(t)}return null===t&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},Va=Ce.TYPE.Comma,Ka={name:"MediaQueryList",structure:{children:[["MediaQuery"]]},parse:function(e){var t=this.createList();for(this.scanner.skipSC();!this.scanner.eof&&(t.push(this.MediaQuery(e)),this.scanner.tokenType===Va);)this.scanner.next();return{type:"MediaQueryList",loc:this.getLocationFromList(t),children:t}},generate:function(e){this.children(e,(function(){this.chunk(",")}))}},Ga=Ce.TYPE.Number,Qa={name:"Number",structure:{value:String},parse:function(){return{type:"Number",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Ga)}},generate:function(e){this.chunk(e.value)}},Xa={name:"Operator",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.next(),{type:"Operator",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},Za=Ce.TYPE,$a=Za.LeftParenthesis,Ja=Za.RightParenthesis,eo={name:"Parentheses",structure:{children:[[]]},parse:function(e,t){var n,r=this.scanner.tokenStart;return this.eat($a),n=e.call(this,t),this.scanner.eof||this.eat(Ja),{type:"Parentheses",loc:this.getLocation(r,this.scanner.tokenStart),children:n}},generate:function(e){this.chunk("("),this.children(e),this.chunk(")")}},to=M.consumeNumber,no=Ce.TYPE.Percentage,ro={name:"Percentage",structure:{value:String},parse:function(){var e=this.scanner.tokenStart,t=to(this.scanner.source,e);return this.eat(no),{type:"Percentage",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.source.substring(e,t)}},generate:function(e){this.chunk(e.value),this.chunk("%")}},io=Ce.TYPE,ao=io.Ident,oo=io.Function,so=io.Colon,lo=io.RightParenthesis,co={name:"PseudoClassSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(so),this.scanner.tokenType===oo?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(lo)):e=this.consume(ao),{type:"PseudoClassSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk(":"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},uo=Ce.TYPE,ho=uo.Ident,po=uo.Function,mo=uo.Colon,go=uo.RightParenthesis,fo={name:"PseudoElementSelector",structure:{name:String,children:[["Raw"],null]},parse:function(){var e,t,n=this.scanner.tokenStart,r=null;return this.eat(mo),this.eat(mo),this.scanner.tokenType===po?(t=(e=this.consumeFunctionName()).toLowerCase(),this.pseudo.hasOwnProperty(t)?(this.scanner.skipSC(),r=this.pseudo[t].call(this),this.scanner.skipSC()):(r=this.createList()).push(this.Raw(this.scanner.tokenIndex,null,!1)),this.eat(go)):e=this.consume(ho),{type:"PseudoElementSelector",loc:this.getLocation(n,this.scanner.tokenStart),name:e,children:r}},generate:function(e){this.chunk("::"),this.chunk(e.name),null!==e.children&&(this.chunk("("),this.children(e),this.chunk(")"))},walkContext:"function"},bo=Ce.isDigit,yo=Ce.TYPE,ko=yo.Number,vo=yo.Delim;function xo(){this.scanner.skipWS();for(var e=this.consume(ko),t=0;t<e.length;t++){var n=e.charCodeAt(t);bo(n)||46===n||this.error("Unsigned number is expected",this.scanner.tokenStart-e.length+t)}return 0===Number(e)&&this.error("Zero number is not allowed",this.scanner.tokenStart-e.length),e}var wo={name:"Ratio",structure:{left:String,right:String},parse:function(){var e,t=this.scanner.tokenStart,n=xo.call(this);return this.scanner.skipWS(),this.scanner.isDelim(47)||this.error("Solidus is expected"),this.eat(vo),e=xo.call(this),{type:"Ratio",loc:this.getLocation(t,this.scanner.tokenStart),left:n,right:e}},generate:function(e){this.chunk(e.left),this.chunk("/"),this.chunk(e.right)}},So=Ce.TYPE,Co=ni.mode,zo=So.LeftCurlyBracket;function Ao(e){return this.Raw(e,Co.leftCurlyBracket,!0)}function Po(){var e=this.SelectorList();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==zo&&this.error(),e}var To={name:"Rule",structure:{prelude:["SelectorList","Raw"],block:["Block"]},parse:function(){var e,t,n=this.scanner.tokenIndex,r=this.scanner.tokenStart;return e=this.parseRulePrelude?this.parseWithFallback(Po,Ao):Ao.call(this,n),t=this.Block(!0),{type:"Rule",loc:this.getLocation(r,this.scanner.tokenStart),prelude:e,block:t}},generate:function(e){this.node(e.prelude),this.node(e.block)},walkContext:"rule"},Lo=Ce.TYPE.Comma,Eo={name:"SelectorList",structure:{children:[["Selector","Raw"]]},parse:function(){for(var e=this.createList();!this.scanner.eof&&(e.push(this.Selector()),this.scanner.tokenType===Lo);)this.scanner.next();return{type:"SelectorList",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e,(function(){this.chunk(",")}))},walkContext:"selector"},Do=Ce.TYPE.String,Oo={name:"String",structure:{value:String},parse:function(){return{type:"String",loc:this.getLocation(this.scanner.tokenStart,this.scanner.tokenEnd),value:this.consume(Do)}},generate:function(e){this.chunk(e.value)}},Bo=Ce.TYPE,Io=Bo.WhiteSpace,No=Bo.Comment,Ro=Bo.AtKeyword,Mo=Bo.CDO,jo=Bo.CDC;function _o(e){return this.Raw(e,null,!1)}var Fo={name:"StyleSheet",structure:{children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]},parse:function(){for(var e,t=this.scanner.tokenStart,n=this.createList();!this.scanner.eof;){switch(this.scanner.tokenType){case Io:this.scanner.next();continue;case No:if(33!==this.scanner.source.charCodeAt(this.scanner.tokenStart+2)){this.scanner.next();continue}e=this.Comment();break;case Mo:e=this.CDO();break;case jo:e=this.CDC();break;case Ro:e=this.parseWithFallback(this.Atrule,_o);break;default:e=this.parseWithFallback(this.Rule,_o)}n.push(e)}return{type:"StyleSheet",loc:this.getLocation(t,this.scanner.tokenStart),children:n}},generate:function(e){this.children(e)},walkContext:"stylesheet"},Wo=Ce.TYPE.Ident;function qo(){this.scanner.tokenType!==Wo&&!1===this.scanner.isDelim(42)&&this.error("Identifier or asterisk is expected"),this.scanner.next()}var Yo={name:"TypeSelector",structure:{name:String},parse:function(){var e=this.scanner.tokenStart;return this.scanner.isDelim(124)?(this.scanner.next(),qo.call(this)):(qo.call(this),this.scanner.isDelim(124)&&(this.scanner.next(),qo.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.scanner.tokenStart),name:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.name)}},Uo=Ce.isHexDigit,Ho=Ce.cmpChar,Vo=Ce.TYPE,Ko=Ce.NAME,Go=Vo.Ident,Qo=Vo.Number,Xo=Vo.Dimension;function Zo(e,t){for(var n=this.scanner.tokenStart+e,r=0;n<this.scanner.tokenEnd;n++){var i=this.scanner.source.charCodeAt(n);if(45===i&&t&&0!==r)return 0===Zo.call(this,e+r+1,!1)&&this.error(),-1;Uo(i)||this.error(t&&0!==r?"HyphenMinus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n)}return this.scanner.next(),r}function $o(e){for(var t=0;this.scanner.isDelim(63);)++t>e&&this.error("Too many question marks"),this.scanner.next()}function Jo(e){this.scanner.source.charCodeAt(this.scanner.tokenStart)!==e&&this.error(Ko[e]+" is expected")}function es(){var e=0;return this.scanner.isDelim(43)?(this.scanner.next(),this.scanner.tokenType===Go?void((e=Zo.call(this,0,!0))>0&&$o.call(this,6-e)):this.scanner.isDelim(63)?(this.scanner.next(),void $o.call(this,5)):void this.error("Hex digit or question mark is expected")):this.scanner.tokenType===Qo?(Jo.call(this,43),e=Zo.call(this,1,!0),this.scanner.isDelim(63)?void $o.call(this,6-e):this.scanner.tokenType===Xo||this.scanner.tokenType===Qo?(Jo.call(this,45),void Zo.call(this,1,!1)):void 0):this.scanner.tokenType===Xo?(Jo.call(this,43),void((e=Zo.call(this,1,!0))>0&&$o.call(this,6-e))):void this.error()}var ts={name:"UnicodeRange",structure:{value:String},parse:function(){var e=this.scanner.tokenStart;return Ho(this.scanner.source,e,117)||this.error("U is expected"),Ho(this.scanner.source,e+1,43)||this.error("Plus sign is expected"),this.scanner.next(),es.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.scanner.tokenStart),value:this.scanner.substrToCursor(e)}},generate:function(e){this.chunk(e.value)}},ns=Ce.isWhiteSpace,rs=Ce.cmpStr,is=Ce.TYPE,as=is.Function,os=is.Url,ss=is.RightParenthesis,ls={name:"Url",structure:{value:["String","Raw"]},parse:function(){var e,t=this.scanner.tokenStart;switch(this.scanner.tokenType){case os:for(var n=t+4,r=this.scanner.tokenEnd-1;n<r&&ns(this.scanner.source.charCodeAt(n));)n++;for(;n<r&&ns(this.scanner.source.charCodeAt(r-1));)r--;e={type:"Raw",loc:this.getLocation(n,r),value:this.scanner.source.substring(n,r)},this.eat(os);break;case as:rs(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(as),this.scanner.skipSC(),e=this.String(),this.scanner.skipSC(),this.eat(ss);break;default:this.error("Url or Function is expected")}return{type:"Url",loc:this.getLocation(t,this.scanner.tokenStart),value:e}},generate:function(e){this.chunk("url"),this.chunk("("),this.node(e.value),this.chunk(")")}},cs=Ce.TYPE.WhiteSpace,us=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),hs={AnPlusB:Gr,Atrule:hi,AtrulePrelude:gi,AttributeSelector:Ci,Block:Mi,Brackets:Wi,CDC:Yi,CDO:Hi,ClassSelector:Ki,Combinator:Qi,Comment:Zi,Declaration:ua,DeclarationList:ka,Dimension:wa,Function:Ca,Hash:Aa,Identifier:Ta,IdSelector:Ea,MediaFeature:_a,MediaQuery:Ha,MediaQueryList:Ka,Nth:{name:"Nth",structure:{nth:["AnPlusB","Identifier"],selector:["SelectorList",null]},parse:function(e){this.scanner.skipSC();var t,n=this.scanner.tokenStart,r=n,i=null;return t=this.scanner.lookupValue(0,"odd")||this.scanner.lookupValue(0,"even")?this.Identifier():this.AnPlusB(),this.scanner.skipSC(),e&&this.scanner.lookupValue(0,"of")?(this.scanner.next(),i=this.SelectorList(),this.needPositions&&(r=this.getLastListNode(i.children).loc.end.offset)):this.needPositions&&(r=t.loc.end.offset),{type:"Nth",loc:this.getLocation(n,r),nth:t,selector:i}},generate:function(e){this.node(e.nth),null!==e.selector&&(this.chunk(" of "),this.node(e.selector))}},Number:Qa,Operator:Xa,Parentheses:eo,Percentage:ro,PseudoClassSelector:co,PseudoElementSelector:fo,Ratio:wo,Raw:ni,Rule:To,Selector:{name:"Selector",structure:{children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]},parse:function(){var e=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(e)&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}},generate:function(e){this.children(e)}},SelectorList:Eo,String:Oo,StyleSheet:Fo,TypeSelector:Yo,UnicodeRange:ts,Url:ls,Value:{name:"Value",structure:{children:[[]]},parse:function(){var e=this.scanner.tokenStart,t=this.readSequence(this.scope.Value);return{type:"Value",loc:this.getLocation(e,this.scanner.tokenStart),children:t}},generate:function(e){this.children(e)}},WhiteSpace:{name:"WhiteSpace",structure:{value:String},parse:function(){return this.eat(cs),us},generate:function(e){this.chunk(e.value)}}},ps={generic:!0,types:Nr.types,atrules:Nr.atrules,properties:Nr.properties,node:hs},ds=Ce.cmpChar,ms=Ce.cmpStr,gs=Ce.TYPE,fs=gs.Ident,bs=gs.String,ys=gs.Number,ks=gs.Function,vs=gs.Url,xs=gs.Hash,ws=gs.Dimension,Ss=gs.Percentage,Cs=gs.LeftParenthesis,zs=gs.LeftSquareBracket,As=gs.Comma,Ps=gs.Delim,Ts=function(e){switch(this.scanner.tokenType){case xs:return this.Hash();case As:return e.space=null,e.ignoreWSAfter=!0,this.Operator();case Cs:return this.Parentheses(this.readSequence,e.recognizer);case zs:return this.Brackets(this.readSequence,e.recognizer);case bs:return this.String();case ws:return this.Dimension();case Ss:return this.Percentage();case ys:return this.Number();case ks:return ms(this.scanner.source,this.scanner.tokenStart,this.scanner.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case vs:return this.Url();case fs:return ds(this.scanner.source,this.scanner.tokenStart,117)&&ds(this.scanner.source,this.scanner.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case Ps:var t=this.scanner.source.charCodeAt(this.scanner.tokenStart);if(47===t||42===t||43===t||45===t)return this.Operator();35===t&&this.error("Hex or identifier is expected",this.scanner.tokenStart+1)}},Ls={getNode:Ts},Es=Ce.TYPE,Ds=Es.Delim,Os=Es.Ident,Bs=Es.Dimension,Is=Es.Percentage,Ns=Es.Number,Rs=Es.Hash,Ms=Es.Colon,js=Es.LeftSquareBracket;var _s={getNode:function(e){switch(this.scanner.tokenType){case js:return this.AttributeSelector();case Rs:return this.IdSelector();case Ms:return this.scanner.lookupType(1)===Ms?this.PseudoElementSelector():this.PseudoClassSelector();case Os:return this.TypeSelector();case Ns:case Is:return this.Percentage();case Bs:46===this.scanner.source.charCodeAt(this.scanner.tokenStart)&&this.error("Identifier is expected",this.scanner.tokenStart+1);break;case Ds:switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case 43:case 62:case 126:return e.space=null,e.ignoreWSAfter=!0,this.Combinator();case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector()}}}},Fs=Ce.TYPE,Ws=ni.mode,qs=Fs.Comma,Ys=Fs.WhiteSpace,Us={AtrulePrelude:Ls,Selector:_s,Value:{getNode:Ts,expression:function(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))},var:function(){var e=this.createList();if(this.scanner.skipSC(),e.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===qs){e.push(this.Operator());const t=this.scanner.tokenIndex,n=this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,Ws.exclamationMarkOrSemicolon,!1);if("Value"===n.type&&n.children.isEmpty())for(let e=t-this.scanner.tokenIndex;e<=0;e++)if(this.scanner.lookupType(e)===Ys){n.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}e.push(n)}return e}}},Hs=Ce.TYPE,Vs=Hs.String,Ks=Hs.Ident,Gs=Hs.Url,Qs=Hs.Function,Xs=Hs.LeftParenthesis,Zs={parse:{prelude:function(){var e=this.createList();switch(this.scanner.skipSC(),this.scanner.tokenType){case Vs:e.push(this.String());break;case Gs:case Qs:e.push(this.Url());break;default:this.error("String or url() is expected")}return this.lookupNonWSType(0)!==Ks&&this.lookupNonWSType(0)!==Xs||(e.push(this.WhiteSpace()),e.push(this.MediaQueryList())),e},block:null}},$s=Ce.TYPE,Js=$s.WhiteSpace,el=$s.Comment,tl=$s.Ident,nl=$s.Function,rl=$s.Colon,il=$s.LeftParenthesis;function al(){return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex,null,!1))}function ol(){return this.scanner.skipSC(),this.scanner.tokenType===tl&&this.lookupNonWSType(1)===rl?this.createSingleNodeList(this.Declaration()):sl.call(this)}function sl(){var e,t=this.createList(),n=null;this.scanner.skipSC();e:for(;!this.scanner.eof;){switch(this.scanner.tokenType){case Js:n=this.WhiteSpace();continue;case el:this.scanner.next();continue;case nl:e=this.Function(al,this.scope.AtrulePrelude);break;case tl:e=this.Identifier();break;case il:e=this.Parentheses(ol,this.scope.AtrulePrelude);break;default:break e}null!==n&&(t.push(n),n=null),t.push(e)}return t}var ll,cl={parse:function(){return this.createSingleNodeList(this.SelectorList())}},ul={parse:function(){return this.createSingleNodeList(this.Nth(!0))}},hl={parse:function(){return this.createSingleNodeList(this.Nth(!1))}},pl={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude:function(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block:function(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Us,atrule:{"font-face":{parse:{prelude:null,block:function(){return this.Block(!0)}}},import:Zs,media:{parse:{prelude:function(){return this.createSingleNodeList(this.MediaQueryList())},block:function(){return this.Block(!1)}}},page:{parse:{prelude:function(){return this.createSingleNodeList(this.SelectorList())},block:function(){return this.Block(!0)}}},supports:{parse:{prelude:function(){var e=sl.call(this);return null===this.getFirstListNode(e)&&this.error("Condition is expected"),e},block:function(){return this.Block(!1)}}}},pseudo:{dir:{parse:function(){return this.createSingleNodeList(this.Identifier())}},has:{parse:function(){return this.createSingleNodeList(this.SelectorList())}},lang:{parse:function(){return this.createSingleNodeList(this.Identifier())}},matches:cl,not:cl,"nth-child":ul,"nth-last-child":ul,"nth-last-of-type":hl,"nth-of-type":hl,slotted:{parse:function(){return this.createSingleNodeList(this.Selector())}}},node:hs},dl={node:hs},ml={version:"1.1.2"},gl=(ll=Object.freeze({__proto__:null,version:"1.1.2",default:ml}))&&ll.default||ll;var fl=Ir(function(){for(var e={},t=0;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}(ps,pl,dl)),bl=gl.version;return fl.version=bl,fl}));
diff --git a/node_modules/csso/node_modules/css-tree/lib/common/List.js b/node_modules/csso/node_modules/css-tree/lib/common/List.js
new file mode 100644
index 0000000..5da834a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/common/List.js
@@ -0,0 +1,576 @@
+//
+// list
+// āāāāāāāā
+// āāāāāāāāāāāāāāāā¼āhead ā
+// ā ā tailāā¼āāāāāāāāāāāāāāā
+// ā āāāāāāāā ā
+// ā¼ ā¼
+// item item item item
+// āāāāāāāā āāāāāāāā āāāāāāāā āāāāāāāā
+// null āāāā¼āprev āāāāāā¼āprev āāāāāā¼āprev āāāāāā¼āprev ā
+// ā nextāā¼āāāā¶ā nextāā¼āāāā¶ā nextāā¼āāāā¶ā nextāā¼āāā¶ null
+// āāāāāāā⤠āāāāāāā⤠āāāāāāā⤠āāāāāāāā¤
+// ā data ā ā data ā ā data ā ā data ā
+// āāāāāāāā āāāāāāāā āāāāāāāā āāāāāāāā
+//
+
+function createItem(data) {
+ return {
+ prev: null,
+ next: null,
+ data: data
+ };
+}
+
+function allocateCursor(node, prev, next) {
+ var cursor;
+
+ if (cursors !== null) {
+ cursor = cursors;
+ cursors = cursors.cursor;
+ cursor.prev = prev;
+ cursor.next = next;
+ cursor.cursor = node.cursor;
+ } else {
+ cursor = {
+ prev: prev,
+ next: next,
+ cursor: node.cursor
+ };
+ }
+
+ node.cursor = cursor;
+
+ return cursor;
+}
+
+function releaseCursor(node) {
+ var cursor = node.cursor;
+
+ node.cursor = cursor.cursor;
+ cursor.prev = null;
+ cursor.next = null;
+ cursor.cursor = cursors;
+ cursors = cursor;
+}
+
+var cursors = null;
+var List = function() {
+ this.cursor = null;
+ this.head = null;
+ this.tail = null;
+};
+
+List.createItem = createItem;
+List.prototype.createItem = createItem;
+
+List.prototype.updateCursors = function(prevOld, prevNew, nextOld, nextNew) {
+ var cursor = this.cursor;
+
+ while (cursor !== null) {
+ if (cursor.prev === prevOld) {
+ cursor.prev = prevNew;
+ }
+
+ if (cursor.next === nextOld) {
+ cursor.next = nextNew;
+ }
+
+ cursor = cursor.cursor;
+ }
+};
+
+List.prototype.getSize = function() {
+ var size = 0;
+ var cursor = this.head;
+
+ while (cursor) {
+ size++;
+ cursor = cursor.next;
+ }
+
+ return size;
+};
+
+List.prototype.fromArray = function(array) {
+ var cursor = null;
+
+ this.head = null;
+
+ for (var i = 0; i < array.length; i++) {
+ var item = createItem(array[i]);
+
+ if (cursor !== null) {
+ cursor.next = item;
+ } else {
+ this.head = item;
+ }
+
+ item.prev = cursor;
+ cursor = item;
+ }
+
+ this.tail = cursor;
+
+ return this;
+};
+
+List.prototype.toArray = function() {
+ var cursor = this.head;
+ var result = [];
+
+ while (cursor) {
+ result.push(cursor.data);
+ cursor = cursor.next;
+ }
+
+ return result;
+};
+
+List.prototype.toJSON = List.prototype.toArray;
+
+List.prototype.isEmpty = function() {
+ return this.head === null;
+};
+
+List.prototype.first = function() {
+ return this.head && this.head.data;
+};
+
+List.prototype.last = function() {
+ return this.tail && this.tail.data;
+};
+
+List.prototype.each = function(fn, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, this.head);
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ fn.call(context, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+};
+
+List.prototype.forEach = List.prototype.each;
+
+List.prototype.eachRight = function(fn, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, this.tail, null);
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ fn.call(context, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+};
+
+List.prototype.forEachRight = List.prototype.eachRight;
+
+List.prototype.reduce = function(fn, initialValue, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, this.head);
+ var acc = initialValue;
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ acc = fn.call(context, acc, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+
+ return acc;
+};
+
+List.prototype.reduceRight = function(fn, initialValue, context) {
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, this.tail, null);
+ var acc = initialValue;
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ acc = fn.call(context, acc, item.data, item, this);
+ }
+
+ // pop cursor
+ releaseCursor(this);
+
+ return acc;
+};
+
+List.prototype.nextUntil = function(start, fn, context) {
+ if (start === null) {
+ return;
+ }
+
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, null, start);
+
+ while (cursor.next !== null) {
+ item = cursor.next;
+ cursor.next = item.next;
+
+ if (fn.call(context, item.data, item, this)) {
+ break;
+ }
+ }
+
+ // pop cursor
+ releaseCursor(this);
+};
+
+List.prototype.prevUntil = function(start, fn, context) {
+ if (start === null) {
+ return;
+ }
+
+ var item;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ // push cursor
+ var cursor = allocateCursor(this, start, null);
+
+ while (cursor.prev !== null) {
+ item = cursor.prev;
+ cursor.prev = item.prev;
+
+ if (fn.call(context, item.data, item, this)) {
+ break;
+ }
+ }
+
+ // pop cursor
+ releaseCursor(this);
+};
+
+List.prototype.some = function(fn, context) {
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ if (fn.call(context, cursor.data, cursor, this)) {
+ return true;
+ }
+
+ cursor = cursor.next;
+ }
+
+ return false;
+};
+
+List.prototype.map = function(fn, context) {
+ var result = new List();
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ result.appendData(fn.call(context, cursor.data, cursor, this));
+ cursor = cursor.next;
+ }
+
+ return result;
+};
+
+List.prototype.filter = function(fn, context) {
+ var result = new List();
+ var cursor = this.head;
+
+ if (context === undefined) {
+ context = this;
+ }
+
+ while (cursor !== null) {
+ if (fn.call(context, cursor.data, cursor, this)) {
+ result.appendData(cursor.data);
+ }
+ cursor = cursor.next;
+ }
+
+ return result;
+};
+
+List.prototype.clear = function() {
+ this.head = null;
+ this.tail = null;
+};
+
+List.prototype.copy = function() {
+ var result = new List();
+ var cursor = this.head;
+
+ while (cursor !== null) {
+ result.insert(createItem(cursor.data));
+ cursor = cursor.next;
+ }
+
+ return result;
+};
+
+List.prototype.prepend = function(item) {
+ // head
+ // ^
+ // item
+ this.updateCursors(null, item, this.head, item);
+
+ // insert to the beginning of the list
+ if (this.head !== null) {
+ // new item <- first item
+ this.head.prev = item;
+
+ // new item -> first item
+ item.next = this.head;
+ } else {
+ // if list has no head, then it also has no tail
+ // in this case tail points to the new item
+ this.tail = item;
+ }
+
+ // head always points to new item
+ this.head = item;
+
+ return this;
+};
+
+List.prototype.prependData = function(data) {
+ return this.prepend(createItem(data));
+};
+
+List.prototype.append = function(item) {
+ return this.insert(item);
+};
+
+List.prototype.appendData = function(data) {
+ return this.insert(createItem(data));
+};
+
+List.prototype.insert = function(item, before) {
+ if (before !== undefined && before !== null) {
+ // prev before
+ // ^
+ // item
+ this.updateCursors(before.prev, item, before, item);
+
+ if (before.prev === null) {
+ // insert to the beginning of list
+ if (this.head !== before) {
+ throw new Error('before doesn\'t belong to list');
+ }
+
+ // since head points to before therefore list doesn't empty
+ // no need to check tail
+ this.head = item;
+ before.prev = item;
+ item.next = before;
+
+ this.updateCursors(null, item);
+ } else {
+
+ // insert between two items
+ before.prev.next = item;
+ item.prev = before.prev;
+
+ before.prev = item;
+ item.next = before;
+ }
+ } else {
+ // tail
+ // ^
+ // item
+ this.updateCursors(this.tail, item, null, item);
+
+ // insert to the ending of the list
+ if (this.tail !== null) {
+ // last item -> new item
+ this.tail.next = item;
+
+ // last item <- new item
+ item.prev = this.tail;
+ } else {
+ // if list has no tail, then it also has no head
+ // in this case head points to new item
+ this.head = item;
+ }
+
+ // tail always points to new item
+ this.tail = item;
+ }
+
+ return this;
+};
+
+List.prototype.insertData = function(data, before) {
+ return this.insert(createItem(data), before);
+};
+
+List.prototype.remove = function(item) {
+ // item
+ // ^
+ // prev next
+ this.updateCursors(item, item.prev, item, item.next);
+
+ if (item.prev !== null) {
+ item.prev.next = item.next;
+ } else {
+ if (this.head !== item) {
+ throw new Error('item doesn\'t belong to list');
+ }
+
+ this.head = item.next;
+ }
+
+ if (item.next !== null) {
+ item.next.prev = item.prev;
+ } else {
+ if (this.tail !== item) {
+ throw new Error('item doesn\'t belong to list');
+ }
+
+ this.tail = item.prev;
+ }
+
+ item.prev = null;
+ item.next = null;
+
+ return item;
+};
+
+List.prototype.push = function(data) {
+ this.insert(createItem(data));
+};
+
+List.prototype.pop = function() {
+ if (this.tail !== null) {
+ return this.remove(this.tail);
+ }
+};
+
+List.prototype.unshift = function(data) {
+ this.prepend(createItem(data));
+};
+
+List.prototype.shift = function() {
+ if (this.head !== null) {
+ return this.remove(this.head);
+ }
+};
+
+List.prototype.prependList = function(list) {
+ return this.insertList(list, this.head);
+};
+
+List.prototype.appendList = function(list) {
+ return this.insertList(list);
+};
+
+List.prototype.insertList = function(list, before) {
+ // ignore empty lists
+ if (list.head === null) {
+ return this;
+ }
+
+ if (before !== undefined && before !== null) {
+ this.updateCursors(before.prev, list.tail, before, list.head);
+
+ // insert in the middle of dist list
+ if (before.prev !== null) {
+ // before.prev <-> list.head
+ before.prev.next = list.head;
+ list.head.prev = before.prev;
+ } else {
+ this.head = list.head;
+ }
+
+ before.prev = list.tail;
+ list.tail.next = before;
+ } else {
+ this.updateCursors(this.tail, list.tail, null, list.head);
+
+ // insert to end of the list
+ if (this.tail !== null) {
+ // if destination list has a tail, then it also has a head,
+ // but head doesn't change
+
+ // dest tail -> source head
+ this.tail.next = list.head;
+
+ // dest tail <- source head
+ list.head.prev = this.tail;
+ } else {
+ // if list has no a tail, then it also has no a head
+ // in this case points head to new item
+ this.head = list.head;
+ }
+
+ // tail always start point to new item
+ this.tail = list.tail;
+ }
+
+ list.head = null;
+ list.tail = null;
+
+ return this;
+};
+
+List.prototype.replace = function(oldItem, newItemOrList) {
+ if ('head' in newItemOrList) {
+ this.insertList(newItemOrList, oldItem);
+ } else {
+ this.insert(newItemOrList, oldItem);
+ }
+
+ this.remove(oldItem);
+};
+
+module.exports = List;
diff --git a/node_modules/csso/node_modules/css-tree/lib/common/OffsetToLocation.js b/node_modules/csso/node_modules/css-tree/lib/common/OffsetToLocation.js
new file mode 100644
index 0000000..eee8228
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/common/OffsetToLocation.js
@@ -0,0 +1,91 @@
+var adoptBuffer = require('./adopt-buffer');
+var isBOM = require('../tokenizer').isBOM;
+
+var N = 10;
+var F = 12;
+var R = 13;
+
+function computeLinesAndColumns(host, source) {
+ var sourceLength = source.length;
+ var lines = adoptBuffer(host.lines, sourceLength); // +1
+ var line = host.startLine;
+ var columns = adoptBuffer(host.columns, sourceLength);
+ var column = host.startColumn;
+ var startOffset = source.length > 0 ? isBOM(source.charCodeAt(0)) : 0;
+
+ for (var i = startOffset; i < sourceLength; i++) { // -1
+ var code = source.charCodeAt(i);
+
+ lines[i] = line;
+ columns[i] = column++;
+
+ if (code === N || code === R || code === F) {
+ if (code === R && i + 1 < sourceLength && source.charCodeAt(i + 1) === N) {
+ i++;
+ lines[i] = line;
+ columns[i] = column;
+ }
+
+ line++;
+ column = 1;
+ }
+ }
+
+ lines[i] = line;
+ columns[i] = column;
+
+ host.lines = lines;
+ host.columns = columns;
+}
+
+var OffsetToLocation = function() {
+ this.lines = null;
+ this.columns = null;
+ this.linesAndColumnsComputed = false;
+};
+
+OffsetToLocation.prototype = {
+ setSource: function(source, startOffset, startLine, startColumn) {
+ this.source = source;
+ this.startOffset = typeof startOffset === 'undefined' ? 0 : startOffset;
+ this.startLine = typeof startLine === 'undefined' ? 1 : startLine;
+ this.startColumn = typeof startColumn === 'undefined' ? 1 : startColumn;
+ this.linesAndColumnsComputed = false;
+ },
+
+ ensureLinesAndColumnsComputed: function() {
+ if (!this.linesAndColumnsComputed) {
+ computeLinesAndColumns(this, this.source);
+ this.linesAndColumnsComputed = true;
+ }
+ },
+ getLocation: function(offset, filename) {
+ this.ensureLinesAndColumnsComputed();
+
+ return {
+ source: filename,
+ offset: this.startOffset + offset,
+ line: this.lines[offset],
+ column: this.columns[offset]
+ };
+ },
+ getLocationRange: function(start, end, filename) {
+ this.ensureLinesAndColumnsComputed();
+
+ return {
+ source: filename,
+ start: {
+ offset: this.startOffset + start,
+ line: this.lines[start],
+ column: this.columns[start]
+ },
+ end: {
+ offset: this.startOffset + end,
+ line: this.lines[end],
+ column: this.columns[end]
+ }
+ };
+ }
+};
+
+module.exports = OffsetToLocation;
diff --git a/node_modules/csso/node_modules/css-tree/lib/common/SyntaxError.js b/node_modules/csso/node_modules/css-tree/lib/common/SyntaxError.js
new file mode 100644
index 0000000..0cbf16a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/common/SyntaxError.js
@@ -0,0 +1,82 @@
+var createCustomError = require('../utils/createCustomError');
+var MAX_LINE_LENGTH = 100;
+var OFFSET_CORRECTION = 60;
+var TAB_REPLACEMENT = ' ';
+
+function sourceFragment(error, extraLines) {
+ function processLines(start, end) {
+ return lines.slice(start, end).map(function(line, idx) {
+ var num = String(start + idx + 1);
+
+ while (num.length < maxNumLength) {
+ num = ' ' + num;
+ }
+
+ return num + ' |' + line;
+ }).join('\n');
+ }
+
+ var lines = error.source.split(/\r\n?|\n|\f/);
+ var line = error.line;
+ var column = error.column;
+ var startLine = Math.max(1, line - extraLines) - 1;
+ var endLine = Math.min(line + extraLines, lines.length + 1);
+ var maxNumLength = Math.max(4, String(endLine).length) + 1;
+ var cutLeft = 0;
+
+ // column correction according to replaced tab before column
+ column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length;
+
+ if (column > MAX_LINE_LENGTH) {
+ cutLeft = column - OFFSET_CORRECTION + 3;
+ column = OFFSET_CORRECTION - 2;
+ }
+
+ for (var i = startLine; i <= endLine; i++) {
+ if (i >= 0 && i < lines.length) {
+ lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT);
+ lines[i] =
+ (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') +
+ lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) +
+ (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : '');
+ }
+ }
+
+ return [
+ processLines(startLine, line),
+ new Array(column + maxNumLength + 2).join('-') + '^',
+ processLines(line, endLine)
+ ].filter(Boolean).join('\n');
+}
+
+var SyntaxError = function(message, source, offset, line, column) {
+ var error = createCustomError('SyntaxError', message);
+
+ error.source = source;
+ error.offset = offset;
+ error.line = line;
+ error.column = column;
+
+ error.sourceFragment = function(extraLines) {
+ return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines);
+ };
+ Object.defineProperty(error, 'formattedMessage', {
+ get: function() {
+ return (
+ 'Parse error: ' + error.message + '\n' +
+ sourceFragment(error, 2)
+ );
+ }
+ });
+
+ // for backward capability
+ error.parseError = {
+ offset: offset,
+ line: line,
+ column: column
+ };
+
+ return error;
+};
+
+module.exports = SyntaxError;
diff --git a/node_modules/csso/node_modules/css-tree/lib/common/TokenStream.js b/node_modules/csso/node_modules/css-tree/lib/common/TokenStream.js
new file mode 100644
index 0000000..5e4c891
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/common/TokenStream.js
@@ -0,0 +1,219 @@
+var constants = require('../tokenizer/const');
+var TYPE = constants.TYPE;
+var NAME = constants.NAME;
+
+var utils = require('../tokenizer/utils');
+var cmpStr = utils.cmpStr;
+
+var EOF = TYPE.EOF;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+
+var OFFSET_MASK = 0x00FFFFFF;
+var TYPE_SHIFT = 24;
+
+var TokenStream = function() {
+ this.offsetAndType = null;
+ this.balance = null;
+
+ this.reset();
+};
+
+TokenStream.prototype = {
+ reset: function() {
+ this.eof = false;
+ this.tokenIndex = -1;
+ this.tokenType = 0;
+ this.tokenStart = this.firstCharOffset;
+ this.tokenEnd = this.firstCharOffset;
+ },
+
+ lookupType: function(offset) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return this.offsetAndType[offset] >> TYPE_SHIFT;
+ }
+
+ return EOF;
+ },
+ lookupOffset: function(offset) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return this.offsetAndType[offset - 1] & OFFSET_MASK;
+ }
+
+ return this.source.length;
+ },
+ lookupValue: function(offset, referenceStr) {
+ offset += this.tokenIndex;
+
+ if (offset < this.tokenCount) {
+ return cmpStr(
+ this.source,
+ this.offsetAndType[offset - 1] & OFFSET_MASK,
+ this.offsetAndType[offset] & OFFSET_MASK,
+ referenceStr
+ );
+ }
+
+ return false;
+ },
+ getTokenStart: function(tokenIndex) {
+ if (tokenIndex === this.tokenIndex) {
+ return this.tokenStart;
+ }
+
+ if (tokenIndex > 0) {
+ return tokenIndex < this.tokenCount
+ ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK
+ : this.offsetAndType[this.tokenCount] & OFFSET_MASK;
+ }
+
+ return this.firstCharOffset;
+ },
+
+ // TODO: -> skipUntilBalanced
+ getRawLength: function(startToken, mode) {
+ var cursor = startToken;
+ var balanceEnd;
+ var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK;
+ var type;
+
+ loop:
+ for (; cursor < this.tokenCount; cursor++) {
+ balanceEnd = this.balance[cursor];
+
+ // stop scanning on balance edge that points to offset before start token
+ if (balanceEnd < startToken) {
+ break loop;
+ }
+
+ type = this.offsetAndType[cursor] >> TYPE_SHIFT;
+
+ // check token is stop type
+ switch (mode(type, this.source, offset)) {
+ case 1:
+ break loop;
+
+ case 2:
+ cursor++;
+ break loop;
+
+ default:
+ offset = this.offsetAndType[cursor] & OFFSET_MASK;
+
+ // fast forward to the end of balanced block
+ if (this.balance[balanceEnd] === cursor) {
+ cursor = balanceEnd;
+ }
+ }
+ }
+
+ return cursor - this.tokenIndex;
+ },
+ isBalanceEdge: function(pos) {
+ return this.balance[this.tokenIndex] < pos;
+ },
+ isDelim: function(code, offset) {
+ if (offset) {
+ return (
+ this.lookupType(offset) === TYPE.Delim &&
+ this.source.charCodeAt(this.lookupOffset(offset)) === code
+ );
+ }
+
+ return (
+ this.tokenType === TYPE.Delim &&
+ this.source.charCodeAt(this.tokenStart) === code
+ );
+ },
+
+ getTokenValue: function() {
+ return this.source.substring(this.tokenStart, this.tokenEnd);
+ },
+ getTokenLength: function() {
+ return this.tokenEnd - this.tokenStart;
+ },
+ substrToCursor: function(start) {
+ return this.source.substring(start, this.tokenStart);
+ },
+
+ skipWS: function() {
+ for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++, skipTokenCount++) {
+ if ((this.offsetAndType[i] >> TYPE_SHIFT) !== WHITESPACE) {
+ break;
+ }
+ }
+
+ if (skipTokenCount > 0) {
+ this.skip(skipTokenCount);
+ }
+ },
+ skipSC: function() {
+ while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) {
+ this.next();
+ }
+ },
+ skip: function(tokenCount) {
+ var next = this.tokenIndex + tokenCount;
+
+ if (next < this.tokenCount) {
+ this.tokenIndex = next;
+ this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK;
+ next = this.offsetAndType[next];
+ this.tokenType = next >> TYPE_SHIFT;
+ this.tokenEnd = next & OFFSET_MASK;
+ } else {
+ this.tokenIndex = this.tokenCount;
+ this.next();
+ }
+ },
+ next: function() {
+ var next = this.tokenIndex + 1;
+
+ if (next < this.tokenCount) {
+ this.tokenIndex = next;
+ this.tokenStart = this.tokenEnd;
+ next = this.offsetAndType[next];
+ this.tokenType = next >> TYPE_SHIFT;
+ this.tokenEnd = next & OFFSET_MASK;
+ } else {
+ this.tokenIndex = this.tokenCount;
+ this.eof = true;
+ this.tokenType = EOF;
+ this.tokenStart = this.tokenEnd = this.source.length;
+ }
+ },
+
+ forEachToken(fn) {
+ for (var i = 0, offset = this.firstCharOffset; i < this.tokenCount; i++) {
+ var start = offset;
+ var item = this.offsetAndType[i];
+ var end = item & OFFSET_MASK;
+ var type = item >> TYPE_SHIFT;
+
+ offset = end;
+
+ fn(type, start, end, i);
+ }
+ },
+
+ dump() {
+ var tokens = new Array(this.tokenCount);
+
+ this.forEachToken((type, start, end, index) => {
+ tokens[index] = {
+ idx: index,
+ type: NAME[type],
+ chunk: this.source.substring(start, end),
+ balance: this.balance[index]
+ };
+ });
+
+ return tokens;
+ }
+};
+
+module.exports = TokenStream;
diff --git a/node_modules/csso/node_modules/css-tree/lib/common/adopt-buffer.js b/node_modules/csso/node_modules/css-tree/lib/common/adopt-buffer.js
new file mode 100644
index 0000000..ef35b9b
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/common/adopt-buffer.js
@@ -0,0 +1,10 @@
+var MIN_SIZE = 16 * 1024;
+var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported
+
+module.exports = function adoptBuffer(buffer, size) {
+ if (buffer === null || buffer.length < size) {
+ return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE));
+ }
+
+ return buffer;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/convertor/create.js b/node_modules/csso/node_modules/css-tree/lib/convertor/create.js
new file mode 100644
index 0000000..f2d1983
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/convertor/create.js
@@ -0,0 +1,28 @@
+var List = require('../common/List');
+
+module.exports = function createConvertors(walk) {
+ return {
+ fromPlainObject: function(ast) {
+ walk(ast, {
+ enter: function(node) {
+ if (node.children && node.children instanceof List === false) {
+ node.children = new List().fromArray(node.children);
+ }
+ }
+ });
+
+ return ast;
+ },
+ toPlainObject: function(ast) {
+ walk(ast, {
+ leave: function(node) {
+ if (node.children && node.children instanceof List) {
+ node.children = node.children.toArray();
+ }
+ }
+ });
+
+ return ast;
+ }
+ };
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/convertor/index.js b/node_modules/csso/node_modules/css-tree/lib/convertor/index.js
new file mode 100644
index 0000000..3248a57
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/convertor/index.js
@@ -0,0 +1,3 @@
+var createConvertor = require('./create');
+
+module.exports = createConvertor(require('../walker'));
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/SyntaxError.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/SyntaxError.js
new file mode 100644
index 0000000..1f2f051
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/SyntaxError.js
@@ -0,0 +1,14 @@
+var createCustomError = require('../utils/createCustomError');
+
+module.exports = function SyntaxError(message, input, offset) {
+ var error = createCustomError('SyntaxError', message);
+
+ error.input = input;
+ error.offset = offset;
+ error.rawMessage = message;
+ error.message = error.rawMessage + '\n' +
+ ' ' + error.input + '\n' +
+ '--' + new Array((error.offset || error.input.length) + 1).join('-') + '^';
+
+ return error;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/generate.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/generate.js
new file mode 100644
index 0000000..786ad2a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/generate.js
@@ -0,0 +1,129 @@
+function noop(value) {
+ return value;
+}
+
+function generateMultiplier(multiplier) {
+ if (multiplier.min === 0 && multiplier.max === 0) {
+ return '*';
+ }
+
+ if (multiplier.min === 0 && multiplier.max === 1) {
+ return '?';
+ }
+
+ if (multiplier.min === 1 && multiplier.max === 0) {
+ return multiplier.comma ? '#' : '+';
+ }
+
+ if (multiplier.min === 1 && multiplier.max === 1) {
+ return '';
+ }
+
+ return (
+ (multiplier.comma ? '#' : '') +
+ (multiplier.min === multiplier.max
+ ? '{' + multiplier.min + '}'
+ : '{' + multiplier.min + ',' + (multiplier.max !== 0 ? multiplier.max : '') + '}'
+ )
+ );
+}
+
+function generateTypeOpts(node) {
+ switch (node.type) {
+ case 'Range':
+ return (
+ ' [' +
+ (node.min === null ? '-∞' : node.min) +
+ ',' +
+ (node.max === null ? '∞' : node.max) +
+ ']'
+ );
+
+ default:
+ throw new Error('Unknown node type `' + node.type + '`');
+ }
+}
+
+function generateSequence(node, decorate, forceBraces, compact) {
+ var combinator = node.combinator === ' ' || compact ? node.combinator : ' ' + node.combinator + ' ';
+ var result = node.terms.map(function(term) {
+ return generate(term, decorate, forceBraces, compact);
+ }).join(combinator);
+
+ if (node.explicit || forceBraces) {
+ result = (compact || result[0] === ',' ? '[' : '[ ') + result + (compact ? ']' : ' ]');
+ }
+
+ return result;
+}
+
+function generate(node, decorate, forceBraces, compact) {
+ var result;
+
+ switch (node.type) {
+ case 'Group':
+ result =
+ generateSequence(node, decorate, forceBraces, compact) +
+ (node.disallowEmpty ? '!' : '');
+ break;
+
+ case 'Multiplier':
+ // return since node is a composition
+ return (
+ generate(node.term, decorate, forceBraces, compact) +
+ decorate(generateMultiplier(node), node)
+ );
+
+ case 'Type':
+ result = '<' + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : '') + '>';
+ break;
+
+ case 'Property':
+ result = '<\'' + node.name + '\'>';
+ break;
+
+ case 'Keyword':
+ result = node.name;
+ break;
+
+ case 'AtKeyword':
+ result = '@' + node.name;
+ break;
+
+ case 'Function':
+ result = node.name + '(';
+ break;
+
+ case 'String':
+ case 'Token':
+ result = node.value;
+ break;
+
+ case 'Comma':
+ result = ',';
+ break;
+
+ default:
+ throw new Error('Unknown node type `' + node.type + '`');
+ }
+
+ return decorate(result, node);
+}
+
+module.exports = function(node, options) {
+ var decorate = noop;
+ var forceBraces = false;
+ var compact = false;
+
+ if (typeof options === 'function') {
+ decorate = options;
+ } else if (options) {
+ forceBraces = Boolean(options.forceBraces);
+ compact = Boolean(options.compact);
+ if (typeof options.decorate === 'function') {
+ decorate = options.decorate;
+ }
+ }
+
+ return generate(node, decorate, forceBraces, compact);
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/index.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/index.js
new file mode 100644
index 0000000..282234a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/index.js
@@ -0,0 +1,6 @@
+module.exports = {
+ SyntaxError: require('./SyntaxError'),
+ parse: require('./parse'),
+ generate: require('./generate'),
+ walk: require('./walk')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/parse.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/parse.js
new file mode 100644
index 0000000..004ac57
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/parse.js
@@ -0,0 +1,568 @@
+var Tokenizer = require('./tokenizer');
+var TAB = 9;
+var N = 10;
+var F = 12;
+var R = 13;
+var SPACE = 32;
+var EXCLAMATIONMARK = 33; // !
+var NUMBERSIGN = 35; // #
+var AMPERSAND = 38; // &
+var APOSTROPHE = 39; // '
+var LEFTPARENTHESIS = 40; // (
+var RIGHTPARENTHESIS = 41; // )
+var ASTERISK = 42; // *
+var PLUSSIGN = 43; // +
+var COMMA = 44; // ,
+var HYPERMINUS = 45; // -
+var LESSTHANSIGN = 60; // <
+var GREATERTHANSIGN = 62; // >
+var QUESTIONMARK = 63; // ?
+var COMMERCIALAT = 64; // @
+var LEFTSQUAREBRACKET = 91; // [
+var RIGHTSQUAREBRACKET = 93; // ]
+var LEFTCURLYBRACKET = 123; // {
+var VERTICALLINE = 124; // |
+var RIGHTCURLYBRACKET = 125; // }
+var INFINITY = 8734; // ∞
+var NAME_CHAR = createCharMap(function(ch) {
+ return /[a-zA-Z0-9\-]/.test(ch);
+});
+var COMBINATOR_PRECEDENCE = {
+ ' ': 1,
+ '&&': 2,
+ '||': 3,
+ '|': 4
+};
+
+function createCharMap(fn) {
+ var array = typeof Uint32Array === 'function' ? new Uint32Array(128) : new Array(128);
+ for (var i = 0; i < 128; i++) {
+ array[i] = fn(String.fromCharCode(i)) ? 1 : 0;
+ }
+ return array;
+}
+
+function scanSpaces(tokenizer) {
+ return tokenizer.substringToPos(
+ tokenizer.findWsEnd(tokenizer.pos)
+ );
+}
+
+function scanWord(tokenizer) {
+ var end = tokenizer.pos;
+
+ for (; end < tokenizer.str.length; end++) {
+ var code = tokenizer.str.charCodeAt(end);
+ if (code >= 128 || NAME_CHAR[code] === 0) {
+ break;
+ }
+ }
+
+ if (tokenizer.pos === end) {
+ tokenizer.error('Expect a keyword');
+ }
+
+ return tokenizer.substringToPos(end);
+}
+
+function scanNumber(tokenizer) {
+ var end = tokenizer.pos;
+
+ for (; end < tokenizer.str.length; end++) {
+ var code = tokenizer.str.charCodeAt(end);
+ if (code < 48 || code > 57) {
+ break;
+ }
+ }
+
+ if (tokenizer.pos === end) {
+ tokenizer.error('Expect a number');
+ }
+
+ return tokenizer.substringToPos(end);
+}
+
+function scanString(tokenizer) {
+ var end = tokenizer.str.indexOf('\'', tokenizer.pos + 1);
+
+ if (end === -1) {
+ tokenizer.pos = tokenizer.str.length;
+ tokenizer.error('Expect an apostrophe');
+ }
+
+ return tokenizer.substringToPos(end + 1);
+}
+
+function readMultiplierRange(tokenizer) {
+ var min = null;
+ var max = null;
+
+ tokenizer.eat(LEFTCURLYBRACKET);
+
+ min = scanNumber(tokenizer);
+
+ if (tokenizer.charCode() === COMMA) {
+ tokenizer.pos++;
+ if (tokenizer.charCode() !== RIGHTCURLYBRACKET) {
+ max = scanNumber(tokenizer);
+ }
+ } else {
+ max = min;
+ }
+
+ tokenizer.eat(RIGHTCURLYBRACKET);
+
+ return {
+ min: Number(min),
+ max: max ? Number(max) : 0
+ };
+}
+
+function readMultiplier(tokenizer) {
+ var range = null;
+ var comma = false;
+
+ switch (tokenizer.charCode()) {
+ case ASTERISK:
+ tokenizer.pos++;
+
+ range = {
+ min: 0,
+ max: 0
+ };
+
+ break;
+
+ case PLUSSIGN:
+ tokenizer.pos++;
+
+ range = {
+ min: 1,
+ max: 0
+ };
+
+ break;
+
+ case QUESTIONMARK:
+ tokenizer.pos++;
+
+ range = {
+ min: 0,
+ max: 1
+ };
+
+ break;
+
+ case NUMBERSIGN:
+ tokenizer.pos++;
+
+ comma = true;
+
+ if (tokenizer.charCode() === LEFTCURLYBRACKET) {
+ range = readMultiplierRange(tokenizer);
+ } else {
+ range = {
+ min: 1,
+ max: 0
+ };
+ }
+
+ break;
+
+ case LEFTCURLYBRACKET:
+ range = readMultiplierRange(tokenizer);
+ break;
+
+ default:
+ return null;
+ }
+
+ return {
+ type: 'Multiplier',
+ comma: comma,
+ min: range.min,
+ max: range.max,
+ term: null
+ };
+}
+
+function maybeMultiplied(tokenizer, node) {
+ var multiplier = readMultiplier(tokenizer);
+
+ if (multiplier !== null) {
+ multiplier.term = node;
+ return multiplier;
+ }
+
+ return node;
+}
+
+function maybeToken(tokenizer) {
+ var ch = tokenizer.peek();
+
+ if (ch === '') {
+ return null;
+ }
+
+ return {
+ type: 'Token',
+ value: ch
+ };
+}
+
+function readProperty(tokenizer) {
+ var name;
+
+ tokenizer.eat(LESSTHANSIGN);
+ tokenizer.eat(APOSTROPHE);
+
+ name = scanWord(tokenizer);
+
+ tokenizer.eat(APOSTROPHE);
+ tokenizer.eat(GREATERTHANSIGN);
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Property',
+ name: name
+ });
+}
+
+// https://drafts.csswg.org/css-values-3/#numeric-ranges
+// 4.1. Range Restrictions and Range Definition Notation
+//
+// Range restrictions can be annotated in the numeric type notation using CSS bracketed
+// range notation—[min,max]—within the angle brackets, after the identifying keyword,
+// indicating a closed range between (and including) min and max.
+// For example, <integer [0, 10]> indicates an integer between 0 and 10, inclusive.
+function readTypeRange(tokenizer) {
+ // use null for Infinity to make AST format JSON serializable/deserializable
+ var min = null; // -Infinity
+ var max = null; // Infinity
+ var sign = 1;
+
+ tokenizer.eat(LEFTSQUAREBRACKET);
+
+ if (tokenizer.charCode() === HYPERMINUS) {
+ tokenizer.peek();
+ sign = -1;
+ }
+
+ if (sign == -1 && tokenizer.charCode() === INFINITY) {
+ tokenizer.peek();
+ } else {
+ min = sign * Number(scanNumber(tokenizer));
+ }
+
+ scanSpaces(tokenizer);
+ tokenizer.eat(COMMA);
+ scanSpaces(tokenizer);
+
+ if (tokenizer.charCode() === INFINITY) {
+ tokenizer.peek();
+ } else {
+ sign = 1;
+
+ if (tokenizer.charCode() === HYPERMINUS) {
+ tokenizer.peek();
+ sign = -1;
+ }
+
+ max = sign * Number(scanNumber(tokenizer));
+ }
+
+ tokenizer.eat(RIGHTSQUAREBRACKET);
+
+ // If no range is indicated, either by using the bracketed range notation
+ // or in the property description, then [−∞,∞] is assumed.
+ if (min === null && max === null) {
+ return null;
+ }
+
+ return {
+ type: 'Range',
+ min: min,
+ max: max
+ };
+}
+
+function readType(tokenizer) {
+ var name;
+ var opts = null;
+
+ tokenizer.eat(LESSTHANSIGN);
+ name = scanWord(tokenizer);
+
+ if (tokenizer.charCode() === LEFTPARENTHESIS &&
+ tokenizer.nextCharCode() === RIGHTPARENTHESIS) {
+ tokenizer.pos += 2;
+ name += '()';
+ }
+
+ if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) {
+ scanSpaces(tokenizer);
+ opts = readTypeRange(tokenizer);
+ }
+
+ tokenizer.eat(GREATERTHANSIGN);
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Type',
+ name: name,
+ opts: opts
+ });
+}
+
+function readKeywordOrFunction(tokenizer) {
+ var name;
+
+ name = scanWord(tokenizer);
+
+ if (tokenizer.charCode() === LEFTPARENTHESIS) {
+ tokenizer.pos++;
+
+ return {
+ type: 'Function',
+ name: name
+ };
+ }
+
+ return maybeMultiplied(tokenizer, {
+ type: 'Keyword',
+ name: name
+ });
+}
+
+function regroupTerms(terms, combinators) {
+ function createGroup(terms, combinator) {
+ return {
+ type: 'Group',
+ terms: terms,
+ combinator: combinator,
+ disallowEmpty: false,
+ explicit: false
+ };
+ }
+
+ combinators = Object.keys(combinators).sort(function(a, b) {
+ return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b];
+ });
+
+ while (combinators.length > 0) {
+ var combinator = combinators.shift();
+ for (var i = 0, subgroupStart = 0; i < terms.length; i++) {
+ var term = terms[i];
+ if (term.type === 'Combinator') {
+ if (term.value === combinator) {
+ if (subgroupStart === -1) {
+ subgroupStart = i - 1;
+ }
+ terms.splice(i, 1);
+ i--;
+ } else {
+ if (subgroupStart !== -1 && i - subgroupStart > 1) {
+ terms.splice(
+ subgroupStart,
+ i - subgroupStart,
+ createGroup(terms.slice(subgroupStart, i), combinator)
+ );
+ i = subgroupStart + 1;
+ }
+ subgroupStart = -1;
+ }
+ }
+ }
+
+ if (subgroupStart !== -1 && combinators.length) {
+ terms.splice(
+ subgroupStart,
+ i - subgroupStart,
+ createGroup(terms.slice(subgroupStart, i), combinator)
+ );
+ }
+ }
+
+ return combinator;
+}
+
+function readImplicitGroup(tokenizer) {
+ var terms = [];
+ var combinators = {};
+ var token;
+ var prevToken = null;
+ var prevTokenPos = tokenizer.pos;
+
+ while (token = peek(tokenizer)) {
+ if (token.type !== 'Spaces') {
+ if (token.type === 'Combinator') {
+ // check for combinator in group beginning and double combinator sequence
+ if (prevToken === null || prevToken.type === 'Combinator') {
+ tokenizer.pos = prevTokenPos;
+ tokenizer.error('Unexpected combinator');
+ }
+
+ combinators[token.value] = true;
+ } else if (prevToken !== null && prevToken.type !== 'Combinator') {
+ combinators[' '] = true; // a b
+ terms.push({
+ type: 'Combinator',
+ value: ' '
+ });
+ }
+
+ terms.push(token);
+ prevToken = token;
+ prevTokenPos = tokenizer.pos;
+ }
+ }
+
+ // check for combinator in group ending
+ if (prevToken !== null && prevToken.type === 'Combinator') {
+ tokenizer.pos -= prevTokenPos;
+ tokenizer.error('Unexpected combinator');
+ }
+
+ return {
+ type: 'Group',
+ terms: terms,
+ combinator: regroupTerms(terms, combinators) || ' ',
+ disallowEmpty: false,
+ explicit: false
+ };
+}
+
+function readGroup(tokenizer) {
+ var result;
+
+ tokenizer.eat(LEFTSQUAREBRACKET);
+ result = readImplicitGroup(tokenizer);
+ tokenizer.eat(RIGHTSQUAREBRACKET);
+
+ result.explicit = true;
+
+ if (tokenizer.charCode() === EXCLAMATIONMARK) {
+ tokenizer.pos++;
+ result.disallowEmpty = true;
+ }
+
+ return result;
+}
+
+function peek(tokenizer) {
+ var code = tokenizer.charCode();
+
+ if (code < 128 && NAME_CHAR[code] === 1) {
+ return readKeywordOrFunction(tokenizer);
+ }
+
+ switch (code) {
+ case RIGHTSQUAREBRACKET:
+ // don't eat, stop scan a group
+ break;
+
+ case LEFTSQUAREBRACKET:
+ return maybeMultiplied(tokenizer, readGroup(tokenizer));
+
+ case LESSTHANSIGN:
+ return tokenizer.nextCharCode() === APOSTROPHE
+ ? readProperty(tokenizer)
+ : readType(tokenizer);
+
+ case VERTICALLINE:
+ return {
+ type: 'Combinator',
+ value: tokenizer.substringToPos(
+ tokenizer.nextCharCode() === VERTICALLINE
+ ? tokenizer.pos + 2
+ : tokenizer.pos + 1
+ )
+ };
+
+ case AMPERSAND:
+ tokenizer.pos++;
+ tokenizer.eat(AMPERSAND);
+
+ return {
+ type: 'Combinator',
+ value: '&&'
+ };
+
+ case COMMA:
+ tokenizer.pos++;
+ return {
+ type: 'Comma'
+ };
+
+ case APOSTROPHE:
+ return maybeMultiplied(tokenizer, {
+ type: 'String',
+ value: scanString(tokenizer)
+ });
+
+ case SPACE:
+ case TAB:
+ case N:
+ case R:
+ case F:
+ return {
+ type: 'Spaces',
+ value: scanSpaces(tokenizer)
+ };
+
+ case COMMERCIALAT:
+ code = tokenizer.nextCharCode();
+
+ if (code < 128 && NAME_CHAR[code] === 1) {
+ tokenizer.pos++;
+ return {
+ type: 'AtKeyword',
+ name: scanWord(tokenizer)
+ };
+ }
+
+ return maybeToken(tokenizer);
+
+ case ASTERISK:
+ case PLUSSIGN:
+ case QUESTIONMARK:
+ case NUMBERSIGN:
+ case EXCLAMATIONMARK:
+ // prohibited tokens (used as a multiplier start)
+ break;
+
+ case LEFTCURLYBRACKET:
+ // LEFTCURLYBRACKET is allowed since mdn/data uses it w/o quoting
+ // check next char isn't a number, because it's likely a disjoined multiplier
+ code = tokenizer.nextCharCode();
+
+ if (code < 48 || code > 57) {
+ return maybeToken(tokenizer);
+ }
+
+ break;
+
+ default:
+ return maybeToken(tokenizer);
+ }
+}
+
+function parse(source) {
+ var tokenizer = new Tokenizer(source);
+ var result = readImplicitGroup(tokenizer);
+
+ if (tokenizer.pos !== source.length) {
+ tokenizer.error('Unexpected input');
+ }
+
+ // reduce redundant groups with single group term
+ if (result.terms.length === 1 && result.terms[0].type === 'Group') {
+ result = result.terms[0];
+ }
+
+ return result;
+}
+
+// warm up parse to elimitate code branches that never execute
+// fix soft deoptimizations (insufficient type feedback)
+parse('[a&&<b>#|<\'c\'>*||e() f{2} /,(% g#{1,2} h{2,})]!');
+
+module.exports = parse;
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/tokenizer.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/tokenizer.js
new file mode 100644
index 0000000..81ee681
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/tokenizer.js
@@ -0,0 +1,55 @@
+var SyntaxError = require('./SyntaxError');
+
+var TAB = 9;
+var N = 10;
+var F = 12;
+var R = 13;
+var SPACE = 32;
+
+var Tokenizer = function(str) {
+ this.str = str;
+ this.pos = 0;
+};
+
+Tokenizer.prototype = {
+ charCodeAt: function(pos) {
+ return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+ },
+ charCode: function() {
+ return this.charCodeAt(this.pos);
+ },
+ nextCharCode: function() {
+ return this.charCodeAt(this.pos + 1);
+ },
+ nextNonWsCode: function(pos) {
+ return this.charCodeAt(this.findWsEnd(pos));
+ },
+ findWsEnd: function(pos) {
+ for (; pos < this.str.length; pos++) {
+ var code = this.str.charCodeAt(pos);
+ if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {
+ break;
+ }
+ }
+
+ return pos;
+ },
+ substringToPos: function(end) {
+ return this.str.substring(this.pos, this.pos = end);
+ },
+ eat: function(code) {
+ if (this.charCode() !== code) {
+ this.error('Expect `' + String.fromCharCode(code) + '`');
+ }
+
+ this.pos++;
+ },
+ peek: function() {
+ return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+ },
+ error: function(message) {
+ throw new SyntaxError(message, this.str, this.pos);
+ }
+};
+
+module.exports = Tokenizer;
diff --git a/node_modules/csso/node_modules/css-tree/lib/definition-syntax/walk.js b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/walk.js
new file mode 100644
index 0000000..7ba80e9
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/definition-syntax/walk.js
@@ -0,0 +1,52 @@
+var noop = function() {};
+
+function ensureFunction(value) {
+ return typeof value === 'function' ? value : noop;
+}
+
+module.exports = function(node, options, context) {
+ function walk(node) {
+ enter.call(context, node);
+
+ switch (node.type) {
+ case 'Group':
+ node.terms.forEach(walk);
+ break;
+
+ case 'Multiplier':
+ walk(node.term);
+ break;
+
+ case 'Type':
+ case 'Property':
+ case 'Keyword':
+ case 'AtKeyword':
+ case 'Function':
+ case 'String':
+ case 'Token':
+ case 'Comma':
+ break;
+
+ default:
+ throw new Error('Unknown type: ' + node.type);
+ }
+
+ leave.call(context, node);
+ }
+
+ var enter = noop;
+ var leave = noop;
+
+ if (typeof options === 'function') {
+ enter = options;
+ } else if (options) {
+ enter = ensureFunction(options.enter);
+ leave = ensureFunction(options.leave);
+ }
+
+ if (enter === noop && leave === noop) {
+ throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+ }
+
+ walk(node, context);
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/generator/create.js b/node_modules/csso/node_modules/css-tree/lib/generator/create.js
new file mode 100644
index 0000000..90fb973
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/generator/create.js
@@ -0,0 +1,66 @@
+var sourceMap = require('./sourceMap');
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function processChildren(node, delimeter) {
+ var list = node.children;
+ var prev = null;
+
+ if (typeof delimeter !== 'function') {
+ list.forEach(this.node, this);
+ } else {
+ list.forEach(function(node) {
+ if (prev !== null) {
+ delimeter.call(this, prev);
+ }
+
+ this.node(node);
+ prev = node;
+ }, this);
+ }
+}
+
+module.exports = function createGenerator(config) {
+ function processNode(node) {
+ if (hasOwnProperty.call(types, node.type)) {
+ types[node.type].call(this, node);
+ } else {
+ throw new Error('Unknown node type: ' + node.type);
+ }
+ }
+
+ var types = {};
+
+ if (config.node) {
+ for (var name in config.node) {
+ types[name] = config.node[name].generate;
+ }
+ }
+
+ return function(node, options) {
+ var buffer = '';
+ var handlers = {
+ children: processChildren,
+ node: processNode,
+ chunk: function(chunk) {
+ buffer += chunk;
+ },
+ result: function() {
+ return buffer;
+ }
+ };
+
+ if (options) {
+ if (typeof options.decorator === 'function') {
+ handlers = options.decorator(handlers);
+ }
+
+ if (options.sourceMap) {
+ handlers = sourceMap(handlers);
+ }
+ }
+
+ handlers.node(node);
+
+ return handlers.result();
+ };
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/generator/index.js b/node_modules/csso/node_modules/css-tree/lib/generator/index.js
new file mode 100644
index 0000000..5bd86a8
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/generator/index.js
@@ -0,0 +1,4 @@
+var createGenerator = require('./create');
+var config = require('../syntax/config/parser');
+
+module.exports = createGenerator(config);
diff --git a/node_modules/csso/node_modules/css-tree/lib/generator/sourceMap.js b/node_modules/csso/node_modules/css-tree/lib/generator/sourceMap.js
new file mode 100644
index 0000000..720c190
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/generator/sourceMap.js
@@ -0,0 +1,95 @@
+var SourceMapGenerator = require('source-map/lib/source-map-generator').SourceMapGenerator;
+var trackNodes = {
+ Atrule: true,
+ Selector: true,
+ Declaration: true
+};
+
+module.exports = function generateSourceMap(handlers) {
+ var map = new SourceMapGenerator();
+ var line = 1;
+ var column = 0;
+ var generated = {
+ line: 1,
+ column: 0
+ };
+ var original = {
+ line: 0, // should be zero to add first mapping
+ column: 0
+ };
+ var sourceMappingActive = false;
+ var activatedGenerated = {
+ line: 1,
+ column: 0
+ };
+ var activatedMapping = {
+ generated: activatedGenerated
+ };
+
+ var handlersNode = handlers.node;
+ handlers.node = function(node) {
+ if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) {
+ var nodeLine = node.loc.start.line;
+ var nodeColumn = node.loc.start.column - 1;
+
+ if (original.line !== nodeLine ||
+ original.column !== nodeColumn) {
+ original.line = nodeLine;
+ original.column = nodeColumn;
+
+ generated.line = line;
+ generated.column = column;
+
+ if (sourceMappingActive) {
+ sourceMappingActive = false;
+ if (generated.line !== activatedGenerated.line ||
+ generated.column !== activatedGenerated.column) {
+ map.addMapping(activatedMapping);
+ }
+ }
+
+ sourceMappingActive = true;
+ map.addMapping({
+ source: node.loc.source,
+ original: original,
+ generated: generated
+ });
+ }
+ }
+
+ handlersNode.call(this, node);
+
+ if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) {
+ activatedGenerated.line = line;
+ activatedGenerated.column = column;
+ }
+ };
+
+ var handlersChunk = handlers.chunk;
+ handlers.chunk = function(chunk) {
+ for (var i = 0; i < chunk.length; i++) {
+ if (chunk.charCodeAt(i) === 10) { // \n
+ line++;
+ column = 0;
+ } else {
+ column++;
+ }
+ }
+
+ handlersChunk(chunk);
+ };
+
+ var handlersResult = handlers.result;
+ handlers.result = function() {
+ if (sourceMappingActive) {
+ map.addMapping(activatedMapping);
+ }
+
+ return {
+ css: handlersResult(),
+ map: map
+ };
+ };
+
+ return handlers;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/index.js b/node_modules/csso/node_modules/css-tree/lib/index.js
new file mode 100644
index 0000000..7688ab9
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/index.js
@@ -0,0 +1 @@
+module.exports = require('./syntax');
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/Lexer.js b/node_modules/csso/node_modules/css-tree/lib/lexer/Lexer.js
new file mode 100644
index 0000000..ce9ac94
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/Lexer.js
@@ -0,0 +1,466 @@
+var SyntaxReferenceError = require('./error').SyntaxReferenceError;
+var SyntaxMatchError = require('./error').SyntaxMatchError;
+var names = require('../utils/names');
+var generic = require('./generic');
+var parse = require('../definition-syntax/parse');
+var generate = require('../definition-syntax/generate');
+var walk = require('../definition-syntax/walk');
+var prepareTokens = require('./prepare-tokens');
+var buildMatchGraph = require('./match-graph').buildMatchGraph;
+var matchAsTree = require('./match').matchAsTree;
+var trace = require('./trace');
+var search = require('./search');
+var getStructureFromConfig = require('./structure').getStructureFromConfig;
+var cssWideKeywords = buildMatchGraph('inherit | initial | unset');
+var cssWideKeywordsWithExpression = buildMatchGraph('inherit | initial | unset | <-ms-legacy-expression>');
+
+function dumpMapSyntax(map, compact, syntaxAsAst) {
+ var result = {};
+
+ for (var name in map) {
+ if (map[name].syntax) {
+ result[name] = syntaxAsAst
+ ? map[name].syntax
+ : generate(map[name].syntax, { compact: compact });
+ }
+ }
+
+ return result;
+}
+
+function dumpAtruleMapSyntax(map, compact, syntaxAsAst) {
+ const result = {};
+
+ for (const [name, atrule] of Object.entries(map)) {
+ result[name] = {
+ prelude: atrule.prelude && (
+ syntaxAsAst
+ ? atrule.prelude.syntax
+ : generate(atrule.prelude.syntax, { compact })
+ ),
+ descriptors: atrule.descriptors && dumpMapSyntax(atrule.descriptors, compact, syntaxAsAst)
+ };
+ }
+
+ return result;
+}
+
+function valueHasVar(tokens) {
+ for (var i = 0; i < tokens.length; i++) {
+ if (tokens[i].value.toLowerCase() === 'var(') {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function buildMatchResult(match, error, iterations) {
+ return {
+ matched: match,
+ iterations: iterations,
+ error: error,
+ getTrace: trace.getTrace,
+ isType: trace.isType,
+ isProperty: trace.isProperty,
+ isKeyword: trace.isKeyword
+ };
+}
+
+function matchSyntax(lexer, syntax, value, useCommon) {
+ var tokens = prepareTokens(value, lexer.syntax);
+ var result;
+
+ if (valueHasVar(tokens)) {
+ return buildMatchResult(null, new Error('Matching for a tree with var() is not supported'));
+ }
+
+ if (useCommon) {
+ result = matchAsTree(tokens, lexer.valueCommonSyntax, lexer);
+ }
+
+ if (!useCommon || !result.match) {
+ result = matchAsTree(tokens, syntax.match, lexer);
+ if (!result.match) {
+ return buildMatchResult(
+ null,
+ new SyntaxMatchError(result.reason, syntax.syntax, value, result),
+ result.iterations
+ );
+ }
+ }
+
+ return buildMatchResult(result.match, null, result.iterations);
+}
+
+var Lexer = function(config, syntax, structure) {
+ this.valueCommonSyntax = cssWideKeywords;
+ this.syntax = syntax;
+ this.generic = false;
+ this.atrules = {};
+ this.properties = {};
+ this.types = {};
+ this.structure = structure || getStructureFromConfig(config);
+
+ if (config) {
+ if (config.types) {
+ for (var name in config.types) {
+ this.addType_(name, config.types[name]);
+ }
+ }
+
+ if (config.generic) {
+ this.generic = true;
+ for (var name in generic) {
+ this.addType_(name, generic[name]);
+ }
+ }
+
+ if (config.atrules) {
+ for (var name in config.atrules) {
+ this.addAtrule_(name, config.atrules[name]);
+ }
+ }
+
+ if (config.properties) {
+ for (var name in config.properties) {
+ this.addProperty_(name, config.properties[name]);
+ }
+ }
+ }
+};
+
+Lexer.prototype = {
+ structure: {},
+ checkStructure: function(ast) {
+ function collectWarning(node, message) {
+ warns.push({
+ node: node,
+ message: message
+ });
+ }
+
+ var structure = this.structure;
+ var warns = [];
+
+ this.syntax.walk(ast, function(node) {
+ if (structure.hasOwnProperty(node.type)) {
+ structure[node.type].check(node, collectWarning);
+ } else {
+ collectWarning(node, 'Unknown node type `' + node.type + '`');
+ }
+ });
+
+ return warns.length ? warns : false;
+ },
+
+ createDescriptor: function(syntax, type, name, parent = null) {
+ var ref = {
+ type: type,
+ name: name
+ };
+ var descriptor = {
+ type: type,
+ name: name,
+ parent: parent,
+ syntax: null,
+ match: null
+ };
+
+ if (typeof syntax === 'function') {
+ descriptor.match = buildMatchGraph(syntax, ref);
+ } else {
+ if (typeof syntax === 'string') {
+ // lazy parsing on first access
+ Object.defineProperty(descriptor, 'syntax', {
+ get: function() {
+ Object.defineProperty(descriptor, 'syntax', {
+ value: parse(syntax)
+ });
+
+ return descriptor.syntax;
+ }
+ });
+ } else {
+ descriptor.syntax = syntax;
+ }
+
+ // lazy graph build on first access
+ Object.defineProperty(descriptor, 'match', {
+ get: function() {
+ Object.defineProperty(descriptor, 'match', {
+ value: buildMatchGraph(descriptor.syntax, ref)
+ });
+
+ return descriptor.match;
+ }
+ });
+ }
+
+ return descriptor;
+ },
+ addAtrule_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.atrules[name] = {
+ type: 'Atrule',
+ name: name,
+ prelude: syntax.prelude ? this.createDescriptor(syntax.prelude, 'AtrulePrelude', name) : null,
+ descriptors: syntax.descriptors
+ ? Object.keys(syntax.descriptors).reduce((res, descName) => {
+ res[descName] = this.createDescriptor(syntax.descriptors[descName], 'AtruleDescriptor', descName, name);
+ return res;
+ }, {})
+ : null
+ };
+ },
+ addProperty_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.properties[name] = this.createDescriptor(syntax, 'Property', name);
+ },
+ addType_: function(name, syntax) {
+ if (!syntax) {
+ return;
+ }
+
+ this.types[name] = this.createDescriptor(syntax, 'Type', name);
+
+ if (syntax === generic['-ms-legacy-expression']) {
+ this.valueCommonSyntax = cssWideKeywordsWithExpression;
+ }
+ },
+
+ checkAtruleName: function(atruleName) {
+ if (!this.getAtrule(atruleName)) {
+ return new SyntaxReferenceError('Unknown at-rule', '@' + atruleName);
+ }
+ },
+ checkAtrulePrelude: function(atruleName, prelude) {
+ let error = this.checkAtruleName(atruleName);
+
+ if (error) {
+ return error;
+ }
+
+ var atrule = this.getAtrule(atruleName);
+
+ if (!atrule.prelude && prelude) {
+ return new SyntaxError('At-rule `@' + atruleName + '` should not contain a prelude');
+ }
+
+ if (atrule.prelude && !prelude) {
+ return new SyntaxError('At-rule `@' + atruleName + '` should contain a prelude');
+ }
+ },
+ checkAtruleDescriptorName: function(atruleName, descriptorName) {
+ let error = this.checkAtruleName(atruleName);
+
+ if (error) {
+ return error;
+ }
+
+ var atrule = this.getAtrule(atruleName);
+ var descriptor = names.keyword(descriptorName);
+
+ if (!atrule.descriptors) {
+ return new SyntaxError('At-rule `@' + atruleName + '` has no known descriptors');
+ }
+
+ if (!atrule.descriptors[descriptor.name] &&
+ !atrule.descriptors[descriptor.basename]) {
+ return new SyntaxReferenceError('Unknown at-rule descriptor', descriptorName);
+ }
+ },
+ checkPropertyName: function(propertyName) {
+ var property = names.property(propertyName);
+
+ // don't match syntax for a custom property
+ if (property.custom) {
+ return new Error('Lexer matching doesn\'t applicable for custom properties');
+ }
+
+ if (!this.getProperty(propertyName)) {
+ return new SyntaxReferenceError('Unknown property', propertyName);
+ }
+ },
+
+ matchAtrulePrelude: function(atruleName, prelude) {
+ var error = this.checkAtrulePrelude(atruleName, prelude);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ if (!prelude) {
+ return buildMatchResult(null, null);
+ }
+
+ return matchSyntax(this, this.getAtrule(atruleName).prelude, prelude, true);
+ },
+ matchAtruleDescriptor: function(atruleName, descriptorName, value) {
+ var error = this.checkAtruleDescriptorName(atruleName, descriptorName);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ var atrule = this.getAtrule(atruleName);
+ var descriptor = names.keyword(descriptorName);
+
+ return matchSyntax(this, atrule.descriptors[descriptor.name] || atrule.descriptors[descriptor.basename], value, true);
+ },
+ matchDeclaration: function(node) {
+ if (node.type !== 'Declaration') {
+ return buildMatchResult(null, new Error('Not a Declaration node'));
+ }
+
+ return this.matchProperty(node.property, node.value);
+ },
+ matchProperty: function(propertyName, value) {
+ var error = this.checkPropertyName(propertyName);
+
+ if (error) {
+ return buildMatchResult(null, error);
+ }
+
+ return matchSyntax(this, this.getProperty(propertyName), value, true);
+ },
+ matchType: function(typeName, value) {
+ var typeSyntax = this.getType(typeName);
+
+ if (!typeSyntax) {
+ return buildMatchResult(null, new SyntaxReferenceError('Unknown type', typeName));
+ }
+
+ return matchSyntax(this, typeSyntax, value, false);
+ },
+ match: function(syntax, value) {
+ if (typeof syntax !== 'string' && (!syntax || !syntax.type)) {
+ return buildMatchResult(null, new SyntaxReferenceError('Bad syntax'));
+ }
+
+ if (typeof syntax === 'string' || !syntax.match) {
+ syntax = this.createDescriptor(syntax, 'Type', 'anonymous');
+ }
+
+ return matchSyntax(this, syntax, value, false);
+ },
+
+ findValueFragments: function(propertyName, value, type, name) {
+ return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name);
+ },
+ findDeclarationValueFragments: function(declaration, type, name) {
+ return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name);
+ },
+ findAllFragments: function(ast, type, name) {
+ var result = [];
+
+ this.syntax.walk(ast, {
+ visit: 'Declaration',
+ enter: function(declaration) {
+ result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name));
+ }.bind(this)
+ });
+
+ return result;
+ },
+
+ getAtrule: function(atruleName, fallbackBasename = true) {
+ var atrule = names.keyword(atruleName);
+ var atruleEntry = atrule.vendor && fallbackBasename
+ ? this.atrules[atrule.name] || this.atrules[atrule.basename]
+ : this.atrules[atrule.name];
+
+ return atruleEntry || null;
+ },
+ getAtrulePrelude: function(atruleName, fallbackBasename = true) {
+ const atrule = this.getAtrule(atruleName, fallbackBasename);
+
+ return atrule && atrule.prelude || null;
+ },
+ getAtruleDescriptor: function(atruleName, name) {
+ return this.atrules.hasOwnProperty(atruleName) && this.atrules.declarators
+ ? this.atrules[atruleName].declarators[name] || null
+ : null;
+ },
+ getProperty: function(propertyName, fallbackBasename = true) {
+ var property = names.property(propertyName);
+ var propertyEntry = property.vendor && fallbackBasename
+ ? this.properties[property.name] || this.properties[property.basename]
+ : this.properties[property.name];
+
+ return propertyEntry || null;
+ },
+ getType: function(name) {
+ return this.types.hasOwnProperty(name) ? this.types[name] : null;
+ },
+
+ validate: function() {
+ function validate(syntax, name, broken, descriptor) {
+ if (broken.hasOwnProperty(name)) {
+ return broken[name];
+ }
+
+ broken[name] = false;
+ if (descriptor.syntax !== null) {
+ walk(descriptor.syntax, function(node) {
+ if (node.type !== 'Type' && node.type !== 'Property') {
+ return;
+ }
+
+ var map = node.type === 'Type' ? syntax.types : syntax.properties;
+ var brokenMap = node.type === 'Type' ? brokenTypes : brokenProperties;
+
+ if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) {
+ broken[name] = true;
+ }
+ }, this);
+ }
+ }
+
+ var brokenTypes = {};
+ var brokenProperties = {};
+
+ for (var key in this.types) {
+ validate(this, key, brokenTypes, this.types[key]);
+ }
+
+ for (var key in this.properties) {
+ validate(this, key, brokenProperties, this.properties[key]);
+ }
+
+ brokenTypes = Object.keys(brokenTypes).filter(function(name) {
+ return brokenTypes[name];
+ });
+ brokenProperties = Object.keys(brokenProperties).filter(function(name) {
+ return brokenProperties[name];
+ });
+
+ if (brokenTypes.length || brokenProperties.length) {
+ return {
+ types: brokenTypes,
+ properties: brokenProperties
+ };
+ }
+
+ return null;
+ },
+ dump: function(syntaxAsAst, pretty) {
+ return {
+ generic: this.generic,
+ types: dumpMapSyntax(this.types, !pretty, syntaxAsAst),
+ properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst),
+ atrules: dumpAtruleMapSyntax(this.atrules, !pretty, syntaxAsAst)
+ };
+ },
+ toString: function() {
+ return JSON.stringify(this.dump());
+ }
+};
+
+module.exports = Lexer;
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/error.js b/node_modules/csso/node_modules/css-tree/lib/lexer/error.js
new file mode 100644
index 0000000..2a6af15
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/error.js
@@ -0,0 +1,127 @@
+const createCustomError = require('../utils/createCustomError');
+const generate = require('../definition-syntax/generate');
+const defaultLoc = { offset: 0, line: 1, column: 1 };
+
+function locateMismatch(matchResult, node) {
+ const tokens = matchResult.tokens;
+ const longestMatch = matchResult.longestMatch;
+ const mismatchNode = longestMatch < tokens.length ? tokens[longestMatch].node || null : null;
+ const badNode = mismatchNode !== node ? mismatchNode : null;
+ let mismatchOffset = 0;
+ let mismatchLength = 0;
+ let entries = 0;
+ let css = '';
+ let start;
+ let end;
+
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i].value;
+
+ if (i === longestMatch) {
+ mismatchLength = token.length;
+ mismatchOffset = css.length;
+ }
+
+ if (badNode !== null && tokens[i].node === badNode) {
+ if (i <= longestMatch) {
+ entries++;
+ } else {
+ entries = 0;
+ }
+ }
+
+ css += token;
+ }
+
+ if (longestMatch === tokens.length || entries > 1) { // last
+ start = fromLoc(badNode || node, 'end') || buildLoc(defaultLoc, css);
+ end = buildLoc(start);
+ } else {
+ start = fromLoc(badNode, 'start') ||
+ buildLoc(fromLoc(node, 'start') || defaultLoc, css.slice(0, mismatchOffset));
+ end = fromLoc(badNode, 'end') ||
+ buildLoc(start, css.substr(mismatchOffset, mismatchLength));
+ }
+
+ return {
+ css,
+ mismatchOffset,
+ mismatchLength,
+ start,
+ end
+ };
+}
+
+function fromLoc(node, point) {
+ const value = node && node.loc && node.loc[point];
+
+ if (value) {
+ return 'line' in value ? buildLoc(value) : value;
+ }
+
+ return null;
+}
+
+function buildLoc({ offset, line, column }, extra) {
+ const loc = {
+ offset,
+ line,
+ column
+ };
+
+ if (extra) {
+ const lines = extra.split(/\n|\r\n?|\f/);
+
+ loc.offset += extra.length;
+ loc.line += lines.length - 1;
+ loc.column = lines.length === 1 ? loc.column + extra.length : lines.pop().length + 1;
+ }
+
+ return loc;
+}
+
+const SyntaxReferenceError = function(type, referenceName) {
+ const error = createCustomError(
+ 'SyntaxReferenceError',
+ type + (referenceName ? ' `' + referenceName + '`' : '')
+ );
+
+ error.reference = referenceName;
+
+ return error;
+};
+
+const SyntaxMatchError = function(message, syntax, node, matchResult) {
+ const error = createCustomError('SyntaxMatchError', message);
+ const {
+ css,
+ mismatchOffset,
+ mismatchLength,
+ start,
+ end
+ } = locateMismatch(matchResult, node);
+
+ error.rawMessage = message;
+ error.syntax = syntax ? generate(syntax) : '<generic>';
+ error.css = css;
+ error.mismatchOffset = mismatchOffset;
+ error.mismatchLength = mismatchLength;
+ error.message = message + '\n' +
+ ' syntax: ' + error.syntax + '\n' +
+ ' value: ' + (css || '<empty string>') + '\n' +
+ ' --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
+
+ Object.assign(error, start);
+ error.loc = {
+ source: (node && node.loc && node.loc.source) || '<unknown>',
+ start,
+ end
+ };
+
+ return error;
+};
+
+module.exports = {
+ SyntaxReferenceError,
+ SyntaxMatchError
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/generic-an-plus-b.js b/node_modules/csso/node_modules/css-tree/lib/lexer/generic-an-plus-b.js
new file mode 100644
index 0000000..7b8a818
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/generic-an-plus-b.js
@@ -0,0 +1,236 @@
+var isDigit = require('../tokenizer').isDigit;
+var cmpChar = require('../tokenizer').cmpChar;
+var TYPE = require('../tokenizer').TYPE;
+
+var DELIM = TYPE.Delim;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var N = 0x006E; // U+006E LATIN SMALL LETTER N (n)
+var DISALLOW_SIGN = true;
+var ALLOW_SIGN = false;
+
+function isDelim(token, code) {
+ return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+}
+
+function skipSC(token, offset, getNextToken) {
+ while (token !== null && (token.type === WHITESPACE || token.type === COMMENT)) {
+ token = getNextToken(++offset);
+ }
+
+ return offset;
+}
+
+function checkInteger(token, valueOffset, disallowSign, offset) {
+ if (!token) {
+ return 0;
+ }
+
+ var code = token.value.charCodeAt(valueOffset);
+
+ if (code === PLUSSIGN || code === HYPHENMINUS) {
+ if (disallowSign) {
+ // Number sign is not allowed
+ return 0;
+ }
+ valueOffset++;
+ }
+
+ for (; valueOffset < token.value.length; valueOffset++) {
+ if (!isDigit(token.value.charCodeAt(valueOffset))) {
+ // Integer is expected
+ return 0;
+ }
+ }
+
+ return offset + 1;
+}
+
+// ... <signed-integer>
+// ... ['+' | '-'] <signless-integer>
+function consumeB(token, offset_, getNextToken) {
+ var sign = false;
+ var offset = skipSC(token, offset_, getNextToken);
+
+ token = getNextToken(offset);
+
+ if (token === null) {
+ return offset_;
+ }
+
+ if (token.type !== NUMBER) {
+ if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS)) {
+ sign = true;
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ if (token === null && token.type !== NUMBER) {
+ return 0;
+ }
+ } else {
+ return offset_;
+ }
+ }
+
+ if (!sign) {
+ var code = token.value.charCodeAt(0);
+ if (code !== PLUSSIGN && code !== HYPHENMINUS) {
+ // Number sign is expected
+ return 0;
+ }
+ }
+
+ return checkInteger(token, sign ? 0 : 1, sign, offset);
+}
+
+// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+module.exports = function anPlusB(token, getNextToken) {
+ /* eslint-disable brace-style*/
+ var offset = 0;
+
+ if (!token) {
+ return 0;
+ }
+
+ // <integer>
+ if (token.type === NUMBER) {
+ return checkInteger(token, 0, ALLOW_SIGN, offset); // b
+ }
+
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ // -n- <signless-integer>
+ // <dashndashdigit-ident>
+ else if (token.type === IDENT && token.value.charCodeAt(0) === HYPHENMINUS) {
+ // expect 1st char is N
+ if (!cmpChar(token.value, 1, N)) {
+ return 0;
+ }
+
+ switch (token.value.length) {
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ case 2:
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+
+ // -n- <signless-integer>
+ case 3:
+ if (token.value.charCodeAt(2) !== HYPHENMINUS) {
+ return 0;
+ }
+
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+ // <dashndashdigit-ident>
+ default:
+ if (token.value.charCodeAt(2) !== HYPHENMINUS) {
+ return 0;
+ }
+
+ return checkInteger(token, 3, DISALLOW_SIGN, offset);
+ }
+ }
+
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ // '+'? n- <signless-integer>
+ // '+'? <ndashdigit-ident>
+ else if (token.type === IDENT || (isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === IDENT)) {
+ // just ignore a plus
+ if (token.type !== IDENT) {
+ token = getNextToken(++offset);
+ }
+
+ if (token === null || !cmpChar(token.value, 0, N)) {
+ return 0;
+ }
+
+ switch (token.value.length) {
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ case 1:
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+
+ // '+'? n- <signless-integer>
+ case 2:
+ if (token.value.charCodeAt(1) !== HYPHENMINUS) {
+ return 0;
+ }
+
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+
+ // '+'? <ndashdigit-ident>
+ default:
+ if (token.value.charCodeAt(1) !== HYPHENMINUS) {
+ return 0;
+ }
+
+ return checkInteger(token, 2, DISALLOW_SIGN, offset);
+ }
+ }
+
+ // <ndashdigit-dimension>
+ // <ndash-dimension> <signless-integer>
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ else if (token.type === DIMENSION) {
+ var code = token.value.charCodeAt(0);
+ var sign = code === PLUSSIGN || code === HYPHENMINUS ? 1 : 0;
+
+ for (var i = sign; i < token.value.length; i++) {
+ if (!isDigit(token.value.charCodeAt(i))) {
+ break;
+ }
+ }
+
+ if (i === sign) {
+ // Integer is expected
+ return 0;
+ }
+
+ if (!cmpChar(token.value, i, N)) {
+ return 0;
+ }
+
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ if (i + 1 === token.value.length) {
+ return consumeB(getNextToken(++offset), offset, getNextToken);
+ } else {
+ if (token.value.charCodeAt(i + 1) !== HYPHENMINUS) {
+ return 0;
+ }
+
+ // <ndash-dimension> <signless-integer>
+ if (i + 2 === token.value.length) {
+ offset = skipSC(getNextToken(++offset), offset, getNextToken);
+ token = getNextToken(offset);
+
+ return checkInteger(token, 0, DISALLOW_SIGN, offset);
+ }
+ // <ndashdigit-dimension>
+ else {
+ return checkInteger(token, i + 2, DISALLOW_SIGN, offset);
+ }
+ }
+ }
+
+ return 0;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/generic-urange.js b/node_modules/csso/node_modules/css-tree/lib/lexer/generic-urange.js
new file mode 100644
index 0000000..2556d70
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/generic-urange.js
@@ -0,0 +1,159 @@
+var isHexDigit = require('../tokenizer').isHexDigit;
+var cmpChar = require('../tokenizer').cmpChar;
+var TYPE = require('../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var DELIM = TYPE.Delim;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+var U = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+function isDelim(token, code) {
+ return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code;
+}
+
+function startsWith(token, code) {
+ return token.value.charCodeAt(0) === code;
+}
+
+function hexSequence(token, offset, allowDash) {
+ for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) {
+ var code = token.value.charCodeAt(pos);
+
+ if (code === HYPHENMINUS && allowDash && hexlen !== 0) {
+ if (hexSequence(token, offset + hexlen + 1, false) > 0) {
+ return 6; // dissallow following question marks
+ }
+
+ return 0; // dash at the ending of a hex sequence is not allowed
+ }
+
+ if (!isHexDigit(code)) {
+ return 0; // not a hex digit
+ }
+
+ if (++hexlen > 6) {
+ return 0; // too many hex digits
+ };
+ }
+
+ return hexlen;
+}
+
+function withQuestionMarkSequence(consumed, length, getNextToken) {
+ if (!consumed) {
+ return 0; // nothing consumed
+ }
+
+ while (isDelim(getNextToken(length), QUESTIONMARK)) {
+ if (++consumed > 6) {
+ return 0; // too many question marks
+ }
+
+ length++;
+ }
+
+ return length;
+}
+
+// https://drafts.csswg.org/css-syntax/#urange
+// Informally, the <urange> production has three forms:
+// U+0001
+// Defines a range consisting of a single code point, in this case the code point "1".
+// U+0001-00ff
+// Defines a range of codepoints between the first and the second value, in this case
+// the range between "1" and "ff" (255 in decimal) inclusive.
+// U+00??
+// Defines a range of codepoints where the "?" characters range over all hex digits,
+// in this case defining the same as the value U+0000-00ff.
+// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+//
+// <urange> =
+// u '+' <ident-token> '?'* |
+// u <dimension-token> '?'* |
+// u <number-token> '?'* |
+// u <number-token> <dimension-token> |
+// u <number-token> <number-token> |
+// u '+' '?'+
+module.exports = function urange(token, getNextToken) {
+ var length = 0;
+
+ // should start with `u` or `U`
+ if (token === null || token.type !== IDENT || !cmpChar(token.value, 0, U)) {
+ return 0;
+ }
+
+ token = getNextToken(++length);
+ if (token === null) {
+ return 0;
+ }
+
+ // u '+' <ident-token> '?'*
+ // u '+' '?'+
+ if (isDelim(token, PLUSSIGN)) {
+ token = getNextToken(++length);
+ if (token === null) {
+ return 0;
+ }
+
+ if (token.type === IDENT) {
+ // u '+' <ident-token> '?'*
+ return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken);
+ }
+
+ if (isDelim(token, QUESTIONMARK)) {
+ // u '+' '?'+
+ return withQuestionMarkSequence(1, ++length, getNextToken);
+ }
+
+ // Hex digit or question mark is expected
+ return 0;
+ }
+
+ // u <number-token> '?'*
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (token.type === NUMBER) {
+ if (!startsWith(token, PLUSSIGN)) {
+ return 0;
+ }
+
+ var consumedHexLength = hexSequence(token, 1, true);
+ if (consumedHexLength === 0) {
+ return 0;
+ }
+
+ token = getNextToken(++length);
+ if (token === null) {
+ // u <number-token> <eof>
+ return length;
+ }
+
+ if (token.type === DIMENSION || token.type === NUMBER) {
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (!startsWith(token, HYPHENMINUS) || !hexSequence(token, 1, false)) {
+ return 0;
+ }
+
+ return length + 1;
+ }
+
+ // u <number-token> '?'*
+ return withQuestionMarkSequence(consumedHexLength, length, getNextToken);
+ }
+
+ // u <dimension-token> '?'*
+ if (token.type === DIMENSION) {
+ if (!startsWith(token, PLUSSIGN)) {
+ return 0;
+ }
+
+ return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken);
+ }
+
+ return 0;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/generic.js b/node_modules/csso/node_modules/css-tree/lib/lexer/generic.js
new file mode 100644
index 0000000..c5b733a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/generic.js
@@ -0,0 +1,585 @@
+var tokenizer = require('../tokenizer');
+var isIdentifierStart = tokenizer.isIdentifierStart;
+var isHexDigit = tokenizer.isHexDigit;
+var isDigit = tokenizer.isDigit;
+var cmpStr = tokenizer.cmpStr;
+var consumeNumber = tokenizer.consumeNumber;
+var TYPE = tokenizer.TYPE;
+var anPlusB = require('./generic-an-plus-b');
+var urange = require('./generic-urange');
+
+var cssWideKeywords = ['unset', 'initial', 'inherit'];
+var calcFunctionNames = ['calc(', '-moz-calc(', '-webkit-calc('];
+
+// https://www.w3.org/TR/css-values-3/#lengths
+var LENGTH = {
+ // absolute length units
+ 'px': true,
+ 'mm': true,
+ 'cm': true,
+ 'in': true,
+ 'pt': true,
+ 'pc': true,
+ 'q': true,
+
+ // relative length units
+ 'em': true,
+ 'ex': true,
+ 'ch': true,
+ 'rem': true,
+
+ // viewport-percentage lengths
+ 'vh': true,
+ 'vw': true,
+ 'vmin': true,
+ 'vmax': true,
+ 'vm': true
+};
+
+var ANGLE = {
+ 'deg': true,
+ 'grad': true,
+ 'rad': true,
+ 'turn': true
+};
+
+var TIME = {
+ 's': true,
+ 'ms': true
+};
+
+var FREQUENCY = {
+ 'hz': true,
+ 'khz': true
+};
+
+// https://www.w3.org/TR/css-values-3/#resolution (https://drafts.csswg.org/css-values/#resolution)
+var RESOLUTION = {
+ 'dpi': true,
+ 'dpcm': true,
+ 'dppx': true,
+ 'x': true // https://github.com/w3c/csswg-drafts/issues/461
+};
+
+// https://drafts.csswg.org/css-grid/#fr-unit
+var FLEX = {
+ 'fr': true
+};
+
+// https://www.w3.org/TR/css3-speech/#mixing-props-voice-volume
+var DECIBEL = {
+ 'db': true
+};
+
+// https://www.w3.org/TR/css3-speech/#voice-props-voice-pitch
+var SEMITONES = {
+ 'st': true
+};
+
+// safe char code getter
+function charCode(str, index) {
+ return index < str.length ? str.charCodeAt(index) : 0;
+}
+
+function eqStr(actual, expected) {
+ return cmpStr(actual, 0, actual.length, expected);
+}
+
+function eqStrAny(actual, expected) {
+ for (var i = 0; i < expected.length; i++) {
+ if (eqStr(actual, expected[i])) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// IE postfix hack, i.e. 123\0 or 123px\9
+function isPostfixIeHack(str, offset) {
+ if (offset !== str.length - 2) {
+ return false;
+ }
+
+ return (
+ str.charCodeAt(offset) === 0x005C && // U+005C REVERSE SOLIDUS (\)
+ isDigit(str.charCodeAt(offset + 1))
+ );
+}
+
+function outOfRange(opts, value, numEnd) {
+ if (opts && opts.type === 'Range') {
+ var num = Number(
+ numEnd !== undefined && numEnd !== value.length
+ ? value.substr(0, numEnd)
+ : value
+ );
+
+ if (isNaN(num)) {
+ return true;
+ }
+
+ if (opts.min !== null && num < opts.min) {
+ return true;
+ }
+
+ if (opts.max !== null && num > opts.max) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+function consumeFunction(token, getNextToken) {
+ var startIdx = token.index;
+ var length = 0;
+
+ // balanced token consuming
+ do {
+ length++;
+
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+}
+
+// TODO: implement
+// can be used wherever <length>, <frequency>, <angle>, <time>, <percentage>, <number>, or <integer> values are allowed
+// https://drafts.csswg.org/css-values/#calc-notation
+function calc(next) {
+ return function(token, getNextToken, opts) {
+ if (token === null) {
+ return 0;
+ }
+
+ if (token.type === TYPE.Function && eqStrAny(token.value, calcFunctionNames)) {
+ return consumeFunction(token, getNextToken);
+ }
+
+ return next(token, getNextToken, opts);
+ };
+}
+
+function tokenType(expectedTokenType) {
+ return function(token) {
+ if (token === null || token.type !== expectedTokenType) {
+ return 0;
+ }
+
+ return 1;
+ };
+}
+
+function func(name) {
+ name = name + '(';
+
+ return function(token, getNextToken) {
+ if (token !== null && eqStr(token.value, name)) {
+ return consumeFunction(token, getNextToken);
+ }
+
+ return 0;
+ };
+}
+
+// =========================
+// Complex types
+//
+
+// https://drafts.csswg.org/css-values-4/#custom-idents
+// 4.2. Author-defined Identifiers: the <custom-ident> type
+// Some properties accept arbitrary author-defined identifiers as a component value.
+// This generic data type is denoted by <custom-ident>, and represents any valid CSS identifier
+// that would not be misinterpreted as a pre-defined keyword in that property’s value definition.
+//
+// See also: https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident
+function customIdent(token) {
+ if (token === null || token.type !== TYPE.Ident) {
+ return 0;
+ }
+
+ var name = token.value.toLowerCase();
+
+ // The CSS-wide keywords are not valid <custom-ident>s
+ if (eqStrAny(name, cssWideKeywords)) {
+ return 0;
+ }
+
+ // The default keyword is reserved and is also not a valid <custom-ident>
+ if (eqStr(name, 'default')) {
+ return 0;
+ }
+
+ // TODO: ignore property specific keywords (as described https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident)
+ // Specifications using <custom-ident> must specify clearly what other keywords
+ // are excluded from <custom-ident>, if any—for example by saying that any pre-defined keywords
+ // in that property’s value definition are excluded. Excluded keywords are excluded
+ // in all ASCII case permutations.
+
+ return 1;
+}
+
+// https://drafts.csswg.org/css-variables/#typedef-custom-property-name
+// A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+// The <custom-property-name> production corresponds to this: it’s defined as any valid identifier
+// that starts with two dashes, except -- itself, which is reserved for future use by CSS.
+// NOTE: Current implementation treat `--` as a valid name since most (all?) major browsers treat it as valid.
+function customPropertyName(token) {
+ // ... defined as any valid identifier
+ if (token === null || token.type !== TYPE.Ident) {
+ return 0;
+ }
+
+ // ... that starts with two dashes (U+002D HYPHEN-MINUS)
+ if (charCode(token.value, 0) !== 0x002D || charCode(token.value, 1) !== 0x002D) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// https://drafts.csswg.org/css-color-4/#hex-notation
+// The syntax of a <hex-color> is a <hash-token> token whose value consists of 3, 4, 6, or 8 hexadecimal digits.
+// In other words, a hex color is written as a hash character, "#", followed by some number of digits 0-9 or
+// letters a-f (the case of the letters doesn’t matter - #00ff00 is identical to #00FF00).
+function hexColor(token) {
+ if (token === null || token.type !== TYPE.Hash) {
+ return 0;
+ }
+
+ var length = token.value.length;
+
+ // valid values (length): #rgb (4), #rgba (5), #rrggbb (7), #rrggbbaa (9)
+ if (length !== 4 && length !== 5 && length !== 7 && length !== 9) {
+ return 0;
+ }
+
+ for (var i = 1; i < length; i++) {
+ if (!isHexDigit(token.value.charCodeAt(i))) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+function idSelector(token) {
+ if (token === null || token.type !== TYPE.Hash) {
+ return 0;
+ }
+
+ if (!isIdentifierStart(charCode(token.value, 1), charCode(token.value, 2), charCode(token.value, 3))) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// https://drafts.csswg.org/css-syntax/#any-value
+// It represents the entirety of what a valid declaration can have as its value.
+function declarationValue(token, getNextToken) {
+ if (!token) {
+ return 0;
+ }
+
+ var length = 0;
+ var level = 0;
+ var startIdx = token.index;
+
+ // The <declaration-value> production matches any sequence of one or more tokens,
+ // so long as the sequence ...
+ scan:
+ do {
+ switch (token.type) {
+ // ... does not contain <bad-string-token>, <bad-url-token>,
+ case TYPE.BadString:
+ case TYPE.BadUrl:
+ break scan;
+
+ // ... unmatched <)-token>, <]-token>, or <}-token>,
+ case TYPE.RightCurlyBracket:
+ case TYPE.RightParenthesis:
+ case TYPE.RightSquareBracket:
+ if (token.balance > token.index || token.balance < startIdx) {
+ break scan;
+ }
+
+ level--;
+ break;
+
+ // ... or top-level <semicolon-token> tokens
+ case TYPE.Semicolon:
+ if (level === 0) {
+ break scan;
+ }
+
+ break;
+
+ // ... or <delim-token> tokens with a value of "!"
+ case TYPE.Delim:
+ if (token.value === '!' && level === 0) {
+ break scan;
+ }
+
+ break;
+
+ case TYPE.Function:
+ case TYPE.LeftParenthesis:
+ case TYPE.LeftSquareBracket:
+ case TYPE.LeftCurlyBracket:
+ level++;
+ break;
+ }
+
+ length++;
+
+ // until balance closing
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+}
+
+// https://drafts.csswg.org/css-syntax/#any-value
+// The <any-value> production is identical to <declaration-value>, but also
+// allows top-level <semicolon-token> tokens and <delim-token> tokens
+// with a value of "!". It represents the entirety of what valid CSS can be in any context.
+function anyValue(token, getNextToken) {
+ if (!token) {
+ return 0;
+ }
+
+ var startIdx = token.index;
+ var length = 0;
+
+ // The <any-value> production matches any sequence of one or more tokens,
+ // so long as the sequence ...
+ scan:
+ do {
+ switch (token.type) {
+ // ... does not contain <bad-string-token>, <bad-url-token>,
+ case TYPE.BadString:
+ case TYPE.BadUrl:
+ break scan;
+
+ // ... unmatched <)-token>, <]-token>, or <}-token>,
+ case TYPE.RightCurlyBracket:
+ case TYPE.RightParenthesis:
+ case TYPE.RightSquareBracket:
+ if (token.balance > token.index || token.balance < startIdx) {
+ break scan;
+ }
+
+ break;
+ }
+
+ length++;
+
+ // until balance closing
+ if (token.balance <= startIdx) {
+ break;
+ }
+ } while (token = getNextToken(length));
+
+ return length;
+}
+
+// =========================
+// Dimensions
+//
+
+function dimension(type) {
+ return function(token, getNextToken, opts) {
+ if (token === null || token.type !== TYPE.Dimension) {
+ return 0;
+ }
+
+ var numberEnd = consumeNumber(token.value, 0);
+
+ // check unit
+ if (type !== null) {
+ // check for IE postfix hack, i.e. 123px\0 or 123px\9
+ var reverseSolidusOffset = token.value.indexOf('\\', numberEnd);
+ var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset)
+ ? token.value.substr(numberEnd)
+ : token.value.substring(numberEnd, reverseSolidusOffset);
+
+ if (type.hasOwnProperty(unit.toLowerCase()) === false) {
+ return 0;
+ }
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, numberEnd)) {
+ return 0;
+ }
+
+ return 1;
+ };
+}
+
+// =========================
+// Percentage
+//
+
+// §5.5. Percentages: the <percentage> type
+// https://drafts.csswg.org/css-values-4/#percentages
+function percentage(token, getNextToken, opts) {
+ // ... corresponds to the <percentage-token> production
+ if (token === null || token.type !== TYPE.Percentage) {
+ return 0;
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, token.value.length - 1)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// =========================
+// Numeric
+//
+
+// https://drafts.csswg.org/css-values-4/#numbers
+// The value <zero> represents a literal number with the value 0. Expressions that merely
+// evaluate to a <number> with the value 0 (for example, calc(0)) do not match <zero>;
+// only literal <number-token>s do.
+function zero(next) {
+ if (typeof next !== 'function') {
+ next = function() {
+ return 0;
+ };
+ }
+
+ return function(token, getNextToken, opts) {
+ if (token !== null && token.type === TYPE.Number) {
+ if (Number(token.value) === 0) {
+ return 1;
+ }
+ }
+
+ return next(token, getNextToken, opts);
+ };
+}
+
+// § 5.3. Real Numbers: the <number> type
+// https://drafts.csswg.org/css-values-4/#numbers
+// Number values are denoted by <number>, and represent real numbers, possibly with a fractional component.
+// ... It corresponds to the <number-token> production
+function number(token, getNextToken, opts) {
+ if (token === null) {
+ return 0;
+ }
+
+ var numberEnd = consumeNumber(token.value, 0);
+ var isNumber = numberEnd === token.value.length;
+ if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) {
+ return 0;
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, numberEnd)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+// §5.2. Integers: the <integer> type
+// https://drafts.csswg.org/css-values-4/#integers
+function integer(token, getNextToken, opts) {
+ // ... corresponds to a subset of the <number-token> production
+ if (token === null || token.type !== TYPE.Number) {
+ return 0;
+ }
+
+ // The first digit of an integer may be immediately preceded by `-` or `+` to indicate the integer’s sign.
+ var i = token.value.charCodeAt(0) === 0x002B || // U+002B PLUS SIGN (+)
+ token.value.charCodeAt(0) === 0x002D ? 1 : 0; // U+002D HYPHEN-MINUS (-)
+
+ // When written literally, an integer is one or more decimal digits 0 through 9 ...
+ for (; i < token.value.length; i++) {
+ if (!isDigit(token.value.charCodeAt(i))) {
+ return 0;
+ }
+ }
+
+ // check range if specified
+ if (outOfRange(opts, token.value, i)) {
+ return 0;
+ }
+
+ return 1;
+}
+
+module.exports = {
+ // token types
+ 'ident-token': tokenType(TYPE.Ident),
+ 'function-token': tokenType(TYPE.Function),
+ 'at-keyword-token': tokenType(TYPE.AtKeyword),
+ 'hash-token': tokenType(TYPE.Hash),
+ 'string-token': tokenType(TYPE.String),
+ 'bad-string-token': tokenType(TYPE.BadString),
+ 'url-token': tokenType(TYPE.Url),
+ 'bad-url-token': tokenType(TYPE.BadUrl),
+ 'delim-token': tokenType(TYPE.Delim),
+ 'number-token': tokenType(TYPE.Number),
+ 'percentage-token': tokenType(TYPE.Percentage),
+ 'dimension-token': tokenType(TYPE.Dimension),
+ 'whitespace-token': tokenType(TYPE.WhiteSpace),
+ 'CDO-token': tokenType(TYPE.CDO),
+ 'CDC-token': tokenType(TYPE.CDC),
+ 'colon-token': tokenType(TYPE.Colon),
+ 'semicolon-token': tokenType(TYPE.Semicolon),
+ 'comma-token': tokenType(TYPE.Comma),
+ '[-token': tokenType(TYPE.LeftSquareBracket),
+ ']-token': tokenType(TYPE.RightSquareBracket),
+ '(-token': tokenType(TYPE.LeftParenthesis),
+ ')-token': tokenType(TYPE.RightParenthesis),
+ '{-token': tokenType(TYPE.LeftCurlyBracket),
+ '}-token': tokenType(TYPE.RightCurlyBracket),
+
+ // token type aliases
+ 'string': tokenType(TYPE.String),
+ 'ident': tokenType(TYPE.Ident),
+
+ // complex types
+ 'custom-ident': customIdent,
+ 'custom-property-name': customPropertyName,
+ 'hex-color': hexColor,
+ 'id-selector': idSelector, // element( <id-selector> )
+ 'an-plus-b': anPlusB,
+ 'urange': urange,
+ 'declaration-value': declarationValue,
+ 'any-value': anyValue,
+
+ // dimensions
+ 'dimension': calc(dimension(null)),
+ 'angle': calc(dimension(ANGLE)),
+ 'decibel': calc(dimension(DECIBEL)),
+ 'frequency': calc(dimension(FREQUENCY)),
+ 'flex': calc(dimension(FLEX)),
+ 'length': calc(zero(dimension(LENGTH))),
+ 'resolution': calc(dimension(RESOLUTION)),
+ 'semitones': calc(dimension(SEMITONES)),
+ 'time': calc(dimension(TIME)),
+
+ // percentage
+ 'percentage': calc(percentage),
+
+ // numeric
+ 'zero': zero(),
+ 'number': calc(number),
+ 'integer': calc(integer),
+
+ // old IE stuff
+ '-ms-legacy-expression': func('expression')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/index.js b/node_modules/csso/node_modules/css-tree/lib/lexer/index.js
new file mode 100644
index 0000000..e29f392
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+ Lexer: require('./Lexer')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/match-graph.js b/node_modules/csso/node_modules/css-tree/lib/lexer/match-graph.js
new file mode 100644
index 0000000..3d27704
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/match-graph.js
@@ -0,0 +1,455 @@
+var parse = require('../definition-syntax/parse');
+
+var MATCH = { type: 'Match' };
+var MISMATCH = { type: 'Mismatch' };
+var DISALLOW_EMPTY = { type: 'DisallowEmpty' };
+var LEFTPARENTHESIS = 40; // (
+var RIGHTPARENTHESIS = 41; // )
+
+function createCondition(match, thenBranch, elseBranch) {
+ // reduce node count
+ if (thenBranch === MATCH && elseBranch === MISMATCH) {
+ return match;
+ }
+
+ if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) {
+ return match;
+ }
+
+ if (match.type === 'If' && match.else === MISMATCH && thenBranch === MATCH) {
+ thenBranch = match.then;
+ match = match.match;
+ }
+
+ return {
+ type: 'If',
+ match: match,
+ then: thenBranch,
+ else: elseBranch
+ };
+}
+
+function isFunctionType(name) {
+ return (
+ name.length > 2 &&
+ name.charCodeAt(name.length - 2) === LEFTPARENTHESIS &&
+ name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS
+ );
+}
+
+function isEnumCapatible(term) {
+ return (
+ term.type === 'Keyword' ||
+ term.type === 'AtKeyword' ||
+ term.type === 'Function' ||
+ term.type === 'Type' && isFunctionType(term.name)
+ );
+}
+
+function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) {
+ switch (combinator) {
+ case ' ':
+ // Juxtaposing components means that all of them must occur, in the given order.
+ //
+ // a b c
+ // =
+ // match a
+ // then match b
+ // then match c
+ // then MATCH
+ // else MISMATCH
+ // else MISMATCH
+ // else MISMATCH
+ var result = MATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+
+ result = createCondition(
+ term,
+ result,
+ MISMATCH
+ );
+ };
+
+ return result;
+
+ case '|':
+ // A bar (|) separates two or more alternatives: exactly one of them must occur.
+ //
+ // a | b | c
+ // =
+ // match a
+ // then MATCH
+ // else match b
+ // then MATCH
+ // else match c
+ // then MATCH
+ // else MISMATCH
+
+ var result = MISMATCH;
+ var map = null;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+
+ // reduce sequence of keywords into a Enum
+ if (isEnumCapatible(term)) {
+ if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) {
+ map = Object.create(null);
+ result = createCondition(
+ {
+ type: 'Enum',
+ map: map
+ },
+ MATCH,
+ result
+ );
+ }
+
+ if (map !== null) {
+ var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase();
+ if (key in map === false) {
+ map[key] = term;
+ continue;
+ }
+ }
+ }
+
+ map = null;
+
+ // create a new conditonal node
+ result = createCondition(
+ term,
+ MATCH,
+ result
+ );
+ };
+
+ return result;
+
+ case '&&':
+ // A double ampersand (&&) separates two or more components,
+ // all of which must occur, in any order.
+
+ // Use MatchOnce for groups with a large number of terms,
+ // since &&-groups produces at least N!-node trees
+ if (terms.length > 5) {
+ return {
+ type: 'MatchOnce',
+ terms: terms,
+ all: true
+ };
+ }
+
+ // Use a combination tree for groups with small number of terms
+ //
+ // a && b && c
+ // =
+ // match a
+ // then [b && c]
+ // else match b
+ // then [a && c]
+ // else match c
+ // then [a && b]
+ // else MISMATCH
+ //
+ // a && b
+ // =
+ // match a
+ // then match b
+ // then MATCH
+ // else MISMATCH
+ // else match b
+ // then match a
+ // then MATCH
+ // else MISMATCH
+ // else MISMATCH
+ var result = MISMATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+ var thenClause;
+
+ if (terms.length > 1) {
+ thenClause = buildGroupMatchGraph(
+ combinator,
+ terms.filter(function(newGroupTerm) {
+ return newGroupTerm !== term;
+ }),
+ false
+ );
+ } else {
+ thenClause = MATCH;
+ }
+
+ result = createCondition(
+ term,
+ thenClause,
+ result
+ );
+ };
+
+ return result;
+
+ case '||':
+ // A double bar (||) separates two or more options:
+ // one or more of them must occur, in any order.
+
+ // Use MatchOnce for groups with a large number of terms,
+ // since ||-groups produces at least N!-node trees
+ if (terms.length > 5) {
+ return {
+ type: 'MatchOnce',
+ terms: terms,
+ all: false
+ };
+ }
+
+ // Use a combination tree for groups with small number of terms
+ //
+ // a || b || c
+ // =
+ // match a
+ // then [b || c]
+ // else match b
+ // then [a || c]
+ // else match c
+ // then [a || b]
+ // else MISMATCH
+ //
+ // a || b
+ // =
+ // match a
+ // then match b
+ // then MATCH
+ // else MATCH
+ // else match b
+ // then match a
+ // then MATCH
+ // else MATCH
+ // else MISMATCH
+ var result = atLeastOneTermMatched ? MATCH : MISMATCH;
+
+ for (var i = terms.length - 1; i >= 0; i--) {
+ var term = terms[i];
+ var thenClause;
+
+ if (terms.length > 1) {
+ thenClause = buildGroupMatchGraph(
+ combinator,
+ terms.filter(function(newGroupTerm) {
+ return newGroupTerm !== term;
+ }),
+ true
+ );
+ } else {
+ thenClause = MATCH;
+ }
+
+ result = createCondition(
+ term,
+ thenClause,
+ result
+ );
+ };
+
+ return result;
+ }
+}
+
+function buildMultiplierMatchGraph(node) {
+ var result = MATCH;
+ var matchTerm = buildMatchGraph(node.term);
+
+ if (node.max === 0) {
+ // disable repeating of empty match to prevent infinite loop
+ matchTerm = createCondition(
+ matchTerm,
+ DISALLOW_EMPTY,
+ MISMATCH
+ );
+
+ // an occurrence count is not limited, make a cycle;
+ // to collect more terms on each following matching mismatch
+ result = createCondition(
+ matchTerm,
+ null, // will be a loop
+ MISMATCH
+ );
+
+ result.then = createCondition(
+ MATCH,
+ MATCH,
+ result // make a loop
+ );
+
+ if (node.comma) {
+ result.then.else = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+ } else {
+ // create a match node chain for [min .. max] interval with optional matches
+ for (var i = node.min || 1; i <= node.max; i++) {
+ if (node.comma && result !== MATCH) {
+ result = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+
+ result = createCondition(
+ matchTerm,
+ createCondition(
+ MATCH,
+ MATCH,
+ result
+ ),
+ MISMATCH
+ );
+ }
+ }
+
+ if (node.min === 0) {
+ // allow zero match
+ result = createCondition(
+ MATCH,
+ MATCH,
+ result
+ );
+ } else {
+ // create a match node chain to collect [0 ... min - 1] required matches
+ for (var i = 0; i < node.min - 1; i++) {
+ if (node.comma && result !== MATCH) {
+ result = createCondition(
+ { type: 'Comma', syntax: node },
+ result,
+ MISMATCH
+ );
+ }
+
+ result = createCondition(
+ matchTerm,
+ result,
+ MISMATCH
+ );
+ }
+ }
+
+ return result;
+}
+
+function buildMatchGraph(node) {
+ if (typeof node === 'function') {
+ return {
+ type: 'Generic',
+ fn: node
+ };
+ }
+
+ switch (node.type) {
+ case 'Group':
+ var result = buildGroupMatchGraph(
+ node.combinator,
+ node.terms.map(buildMatchGraph),
+ false
+ );
+
+ if (node.disallowEmpty) {
+ result = createCondition(
+ result,
+ DISALLOW_EMPTY,
+ MISMATCH
+ );
+ }
+
+ return result;
+
+ case 'Multiplier':
+ return buildMultiplierMatchGraph(node);
+
+ case 'Type':
+ case 'Property':
+ return {
+ type: node.type,
+ name: node.name,
+ syntax: node
+ };
+
+ case 'Keyword':
+ return {
+ type: node.type,
+ name: node.name.toLowerCase(),
+ syntax: node
+ };
+
+ case 'AtKeyword':
+ return {
+ type: node.type,
+ name: '@' + node.name.toLowerCase(),
+ syntax: node
+ };
+
+ case 'Function':
+ return {
+ type: node.type,
+ name: node.name.toLowerCase() + '(',
+ syntax: node
+ };
+
+ case 'String':
+ // convert a one char length String to a Token
+ if (node.value.length === 3) {
+ return {
+ type: 'Token',
+ value: node.value.charAt(1),
+ syntax: node
+ };
+ }
+
+ // otherwise use it as is
+ return {
+ type: node.type,
+ value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, '\''),
+ syntax: node
+ };
+
+ case 'Token':
+ return {
+ type: node.type,
+ value: node.value,
+ syntax: node
+ };
+
+ case 'Comma':
+ return {
+ type: node.type,
+ syntax: node
+ };
+
+ default:
+ throw new Error('Unknown node type:', node.type);
+ }
+}
+
+module.exports = {
+ MATCH: MATCH,
+ MISMATCH: MISMATCH,
+ DISALLOW_EMPTY: DISALLOW_EMPTY,
+ buildMatchGraph: function(syntaxTree, ref) {
+ if (typeof syntaxTree === 'string') {
+ syntaxTree = parse(syntaxTree);
+ }
+
+ return {
+ type: 'MatchGraph',
+ match: buildMatchGraph(syntaxTree),
+ syntax: ref || null,
+ source: syntaxTree
+ };
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/match.js b/node_modules/csso/node_modules/css-tree/lib/lexer/match.js
new file mode 100644
index 0000000..333ed7f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/match.js
@@ -0,0 +1,639 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var matchGraph = require('./match-graph');
+var MATCH = matchGraph.MATCH;
+var MISMATCH = matchGraph.MISMATCH;
+var DISALLOW_EMPTY = matchGraph.DISALLOW_EMPTY;
+var TYPE = require('../tokenizer/const').TYPE;
+
+var STUB = 0;
+var TOKEN = 1;
+var OPEN_SYNTAX = 2;
+var CLOSE_SYNTAX = 3;
+
+var EXIT_REASON_MATCH = 'Match';
+var EXIT_REASON_MISMATCH = 'Mismatch';
+var EXIT_REASON_ITERATION_LIMIT = 'Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)';
+
+var ITERATION_LIMIT = 15000;
+var totalIterationCount = 0;
+
+function reverseList(list) {
+ var prev = null;
+ var next = null;
+ var item = list;
+
+ while (item !== null) {
+ next = item.prev;
+ item.prev = prev;
+ prev = item;
+ item = next;
+ }
+
+ return prev;
+}
+
+function areStringsEqualCaseInsensitive(testStr, referenceStr) {
+ if (testStr.length !== referenceStr.length) {
+ return false;
+ }
+
+ for (var i = 0; i < testStr.length; i++) {
+ var testCode = testStr.charCodeAt(i);
+ var referenceCode = referenceStr.charCodeAt(i);
+
+ // testCode.toLowerCase() for U+0041 LATIN CAPITAL LETTER A (A) .. U+005A LATIN CAPITAL LETTER Z (Z).
+ if (testCode >= 0x0041 && testCode <= 0x005A) {
+ testCode = testCode | 32;
+ }
+
+ if (testCode !== referenceCode) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function isContextEdgeDelim(token) {
+ if (token.type !== TYPE.Delim) {
+ return false;
+ }
+
+ // Fix matching for unicode-range: U+30??, U+FF00-FF9F
+ // Probably we need to check out previous match instead
+ return token.value !== '?';
+}
+
+function isCommaContextStart(token) {
+ if (token === null) {
+ return true;
+ }
+
+ return (
+ token.type === TYPE.Comma ||
+ token.type === TYPE.Function ||
+ token.type === TYPE.LeftParenthesis ||
+ token.type === TYPE.LeftSquareBracket ||
+ token.type === TYPE.LeftCurlyBracket ||
+ isContextEdgeDelim(token)
+ );
+}
+
+function isCommaContextEnd(token) {
+ if (token === null) {
+ return true;
+ }
+
+ return (
+ token.type === TYPE.RightParenthesis ||
+ token.type === TYPE.RightSquareBracket ||
+ token.type === TYPE.RightCurlyBracket ||
+ token.type === TYPE.Delim
+ );
+}
+
+function internalMatch(tokens, state, syntaxes) {
+ function moveToNextToken() {
+ do {
+ tokenIndex++;
+ token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+ } while (token !== null && (token.type === TYPE.WhiteSpace || token.type === TYPE.Comment));
+ }
+
+ function getNextToken(offset) {
+ var nextIndex = tokenIndex + offset;
+
+ return nextIndex < tokens.length ? tokens[nextIndex] : null;
+ }
+
+ function stateSnapshotFromSyntax(nextState, prev) {
+ return {
+ nextState: nextState,
+ matchStack: matchStack,
+ syntaxStack: syntaxStack,
+ thenStack: thenStack,
+ tokenIndex: tokenIndex,
+ prev: prev
+ };
+ }
+
+ function pushThenStack(nextState) {
+ thenStack = {
+ nextState: nextState,
+ matchStack: matchStack,
+ syntaxStack: syntaxStack,
+ prev: thenStack
+ };
+ }
+
+ function pushElseStack(nextState) {
+ elseStack = stateSnapshotFromSyntax(nextState, elseStack);
+ }
+
+ function addTokenToMatch() {
+ matchStack = {
+ type: TOKEN,
+ syntax: state.syntax,
+ token: token,
+ prev: matchStack
+ };
+
+ moveToNextToken();
+ syntaxStash = null;
+
+ if (tokenIndex > longestMatch) {
+ longestMatch = tokenIndex;
+ }
+ }
+
+ function openSyntax() {
+ syntaxStack = {
+ syntax: state.syntax,
+ opts: state.syntax.opts || (syntaxStack !== null && syntaxStack.opts) || null,
+ prev: syntaxStack
+ };
+
+ matchStack = {
+ type: OPEN_SYNTAX,
+ syntax: state.syntax,
+ token: matchStack.token,
+ prev: matchStack
+ };
+ }
+
+ function closeSyntax() {
+ if (matchStack.type === OPEN_SYNTAX) {
+ matchStack = matchStack.prev;
+ } else {
+ matchStack = {
+ type: CLOSE_SYNTAX,
+ syntax: syntaxStack.syntax,
+ token: matchStack.token,
+ prev: matchStack
+ };
+ }
+
+ syntaxStack = syntaxStack.prev;
+ }
+
+ var syntaxStack = null;
+ var thenStack = null;
+ var elseStack = null;
+
+ // null – stashing allowed, nothing stashed
+ // false – stashing disabled, nothing stashed
+ // anithing else – fail stashable syntaxes, some syntax stashed
+ var syntaxStash = null;
+
+ var iterationCount = 0; // count iterations and prevent infinite loop
+ var exitReason = null;
+
+ var token = null;
+ var tokenIndex = -1;
+ var longestMatch = 0;
+ var matchStack = {
+ type: STUB,
+ syntax: null,
+ token: null,
+ prev: null
+ };
+
+ moveToNextToken();
+
+ while (exitReason === null && ++iterationCount < ITERATION_LIMIT) {
+ // function mapList(list, fn) {
+ // var result = [];
+ // while (list) {
+ // result.unshift(fn(list));
+ // list = list.prev;
+ // }
+ // return result;
+ // }
+ // console.log('--\n',
+ // '#' + iterationCount,
+ // require('util').inspect({
+ // match: mapList(matchStack, x => x.type === TOKEN ? x.token && x.token.value : x.syntax ? ({ [OPEN_SYNTAX]: '<', [CLOSE_SYNTAX]: '</' }[x.type] || x.type) + '!' + x.syntax.name : null),
+ // token: token && token.value,
+ // tokenIndex,
+ // syntax: syntax.type + (syntax.id ? ' #' + syntax.id : '')
+ // }, { depth: null })
+ // );
+ switch (state.type) {
+ case 'Match':
+ if (thenStack === null) {
+ // turn to MISMATCH when some tokens left unmatched
+ if (token !== null) {
+ // doesn't mismatch if just one token left and it's an IE hack
+ if (tokenIndex !== tokens.length - 1 || (token.value !== '\\0' && token.value !== '\\9')) {
+ state = MISMATCH;
+ break;
+ }
+ }
+
+ // break the main loop, return a result - MATCH
+ exitReason = EXIT_REASON_MATCH;
+ break;
+ }
+
+ // go to next syntax (`then` branch)
+ state = thenStack.nextState;
+
+ // check match is not empty
+ if (state === DISALLOW_EMPTY) {
+ if (thenStack.matchStack === matchStack) {
+ state = MISMATCH;
+ break;
+ } else {
+ state = MATCH;
+ }
+ }
+
+ // close syntax if needed
+ while (thenStack.syntaxStack !== syntaxStack) {
+ closeSyntax();
+ }
+
+ // pop stack
+ thenStack = thenStack.prev;
+ break;
+
+ case 'Mismatch':
+ // when some syntax is stashed
+ if (syntaxStash !== null && syntaxStash !== false) {
+ // there is no else branches or a branch reduce match stack
+ if (elseStack === null || tokenIndex > elseStack.tokenIndex) {
+ // restore state from the stash
+ elseStack = syntaxStash;
+ syntaxStash = false; // disable stashing
+ }
+ } else if (elseStack === null) {
+ // no else branches -> break the main loop
+ // return a result - MISMATCH
+ exitReason = EXIT_REASON_MISMATCH;
+ break;
+ }
+
+ // go to next syntax (`else` branch)
+ state = elseStack.nextState;
+
+ // restore all the rest stack states
+ thenStack = elseStack.thenStack;
+ syntaxStack = elseStack.syntaxStack;
+ matchStack = elseStack.matchStack;
+ tokenIndex = elseStack.tokenIndex;
+ token = tokenIndex < tokens.length ? tokens[tokenIndex] : null;
+
+ // pop stack
+ elseStack = elseStack.prev;
+ break;
+
+ case 'MatchGraph':
+ state = state.match;
+ break;
+
+ case 'If':
+ // IMPORTANT: else stack push must go first,
+ // since it stores the state of thenStack before changes
+ if (state.else !== MISMATCH) {
+ pushElseStack(state.else);
+ }
+
+ if (state.then !== MATCH) {
+ pushThenStack(state.then);
+ }
+
+ state = state.match;
+ break;
+
+ case 'MatchOnce':
+ state = {
+ type: 'MatchOnceBuffer',
+ syntax: state,
+ index: 0,
+ mask: 0
+ };
+ break;
+
+ case 'MatchOnceBuffer':
+ var terms = state.syntax.terms;
+
+ if (state.index === terms.length) {
+ // no matches at all or it's required all terms to be matched
+ if (state.mask === 0 || state.syntax.all) {
+ state = MISMATCH;
+ break;
+ }
+
+ // a partial match is ok
+ state = MATCH;
+ break;
+ }
+
+ // all terms are matched
+ if (state.mask === (1 << terms.length) - 1) {
+ state = MATCH;
+ break;
+ }
+
+ for (; state.index < terms.length; state.index++) {
+ var matchFlag = 1 << state.index;
+
+ if ((state.mask & matchFlag) === 0) {
+ // IMPORTANT: else stack push must go first,
+ // since it stores the state of thenStack before changes
+ pushElseStack(state);
+ pushThenStack({
+ type: 'AddMatchOnce',
+ syntax: state.syntax,
+ mask: state.mask | matchFlag
+ });
+
+ // match
+ state = terms[state.index++];
+ break;
+ }
+ }
+ break;
+
+ case 'AddMatchOnce':
+ state = {
+ type: 'MatchOnceBuffer',
+ syntax: state.syntax,
+ index: 0,
+ mask: state.mask
+ };
+ break;
+
+ case 'Enum':
+ if (token !== null) {
+ var name = token.value.toLowerCase();
+
+ // drop \0 and \9 hack from keyword name
+ if (name.indexOf('\\') !== -1) {
+ name = name.replace(/\\[09].*$/, '');
+ }
+
+ if (hasOwnProperty.call(state.map, name)) {
+ state = state.map[name];
+ break;
+ }
+ }
+
+ state = MISMATCH;
+ break;
+
+ case 'Generic':
+ var opts = syntaxStack !== null ? syntaxStack.opts : null;
+ var lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts));
+
+ if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) {
+ while (tokenIndex < lastTokenIndex) {
+ addTokenToMatch();
+ }
+
+ state = MATCH;
+ } else {
+ state = MISMATCH;
+ }
+
+ break;
+
+ case 'Type':
+ case 'Property':
+ var syntaxDict = state.type === 'Type' ? 'types' : 'properties';
+ var dictSyntax = hasOwnProperty.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null;
+
+ if (!dictSyntax || !dictSyntax.match) {
+ throw new Error(
+ 'Bad syntax reference: ' +
+ (state.type === 'Type'
+ ? '<' + state.name + '>'
+ : '<\'' + state.name + '\'>')
+ );
+ }
+
+ // stash a syntax for types with low priority
+ if (syntaxStash !== false && token !== null && state.type === 'Type') {
+ var lowPriorityMatching =
+ // https://drafts.csswg.org/css-values-4/#custom-idents
+ // When parsing positionally-ambiguous keywords in a property value, a <custom-ident> production
+ // can only claim the keyword if no other unfulfilled production can claim it.
+ (state.name === 'custom-ident' && token.type === TYPE.Ident) ||
+
+ // https://drafts.csswg.org/css-values-4/#lengths
+ // ... if a `0` could be parsed as either a <number> or a <length> in a property (such as line-height),
+ // it must parse as a <number>
+ (state.name === 'length' && token.value === '0');
+
+ if (lowPriorityMatching) {
+ if (syntaxStash === null) {
+ syntaxStash = stateSnapshotFromSyntax(state, elseStack);
+ }
+
+ state = MISMATCH;
+ break;
+ }
+ }
+
+ openSyntax();
+ state = dictSyntax.match;
+ break;
+
+ case 'Keyword':
+ var name = state.name;
+
+ if (token !== null) {
+ var keywordName = token.value;
+
+ // drop \0 and \9 hack from keyword name
+ if (keywordName.indexOf('\\') !== -1) {
+ keywordName = keywordName.replace(/\\[09].*$/, '');
+ }
+
+ if (areStringsEqualCaseInsensitive(keywordName, name)) {
+ addTokenToMatch();
+ state = MATCH;
+ break;
+ }
+ }
+
+ state = MISMATCH;
+ break;
+
+ case 'AtKeyword':
+ case 'Function':
+ if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) {
+ addTokenToMatch();
+ state = MATCH;
+ break;
+ }
+
+ state = MISMATCH;
+ break;
+
+ case 'Token':
+ if (token !== null && token.value === state.value) {
+ addTokenToMatch();
+ state = MATCH;
+ break;
+ }
+
+ state = MISMATCH;
+ break;
+
+ case 'Comma':
+ if (token !== null && token.type === TYPE.Comma) {
+ if (isCommaContextStart(matchStack.token)) {
+ state = MISMATCH;
+ } else {
+ addTokenToMatch();
+ state = isCommaContextEnd(token) ? MISMATCH : MATCH;
+ }
+ } else {
+ state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH : MISMATCH;
+ }
+
+ break;
+
+ case 'String':
+ var string = '';
+
+ for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) {
+ string += tokens[lastTokenIndex].value;
+ }
+
+ if (areStringsEqualCaseInsensitive(string, state.value)) {
+ while (tokenIndex < lastTokenIndex) {
+ addTokenToMatch();
+ }
+
+ state = MATCH;
+ } else {
+ state = MISMATCH;
+ }
+
+ break;
+
+ default:
+ throw new Error('Unknown node type: ' + state.type);
+ }
+ }
+
+ totalIterationCount += iterationCount;
+
+ switch (exitReason) {
+ case null:
+ console.warn('[csstree-match] BREAK after ' + ITERATION_LIMIT + ' iterations');
+ exitReason = EXIT_REASON_ITERATION_LIMIT;
+ matchStack = null;
+ break;
+
+ case EXIT_REASON_MATCH:
+ while (syntaxStack !== null) {
+ closeSyntax();
+ }
+ break;
+
+ default:
+ matchStack = null;
+ }
+
+ return {
+ tokens: tokens,
+ reason: exitReason,
+ iterations: iterationCount,
+ match: matchStack,
+ longestMatch: longestMatch
+ };
+}
+
+function matchAsList(tokens, matchGraph, syntaxes) {
+ var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+ if (matchResult.match !== null) {
+ var item = reverseList(matchResult.match).prev;
+
+ matchResult.match = [];
+
+ while (item !== null) {
+ switch (item.type) {
+ case STUB:
+ break;
+
+ case OPEN_SYNTAX:
+ case CLOSE_SYNTAX:
+ matchResult.match.push({
+ type: item.type,
+ syntax: item.syntax
+ });
+ break;
+
+ default:
+ matchResult.match.push({
+ token: item.token.value,
+ node: item.token.node
+ });
+ break;
+ }
+
+ item = item.prev;
+ }
+ }
+
+ return matchResult;
+}
+
+function matchAsTree(tokens, matchGraph, syntaxes) {
+ var matchResult = internalMatch(tokens, matchGraph, syntaxes || {});
+
+ if (matchResult.match === null) {
+ return matchResult;
+ }
+
+ var item = matchResult.match;
+ var host = matchResult.match = {
+ syntax: matchGraph.syntax || null,
+ match: []
+ };
+ var hostStack = [host];
+
+ // revert a list and start with 2nd item since 1st is a stub item
+ item = reverseList(item).prev;
+
+ // build a tree
+ while (item !== null) {
+ switch (item.type) {
+ case OPEN_SYNTAX:
+ host.match.push(host = {
+ syntax: item.syntax,
+ match: []
+ });
+ hostStack.push(host);
+ break;
+
+ case CLOSE_SYNTAX:
+ hostStack.pop();
+ host = hostStack[hostStack.length - 1];
+ break;
+
+ default:
+ host.match.push({
+ syntax: item.syntax || null,
+ token: item.token.value,
+ node: item.token.node
+ });
+ }
+
+ item = item.prev;
+ }
+
+ return matchResult;
+}
+
+module.exports = {
+ matchAsList: matchAsList,
+ matchAsTree: matchAsTree,
+ getTotalIterationCount: function() {
+ return totalIterationCount;
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/prepare-tokens.js b/node_modules/csso/node_modules/css-tree/lib/lexer/prepare-tokens.js
new file mode 100644
index 0000000..0a9d65e
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/prepare-tokens.js
@@ -0,0 +1,73 @@
+var tokenize = require('../tokenizer');
+var TokenStream = require('../common/TokenStream');
+var tokenStream = new TokenStream();
+var astToTokens = {
+ decorator: function(handlers) {
+ var curNode = null;
+ var prev = { len: 0, node: null };
+ var nodes = [prev];
+ var buffer = '';
+
+ return {
+ children: handlers.children,
+ node: function(node) {
+ var tmp = curNode;
+ curNode = node;
+ handlers.node.call(this, node);
+ curNode = tmp;
+ },
+ chunk: function(chunk) {
+ buffer += chunk;
+ if (prev.node !== curNode) {
+ nodes.push({
+ len: chunk.length,
+ node: curNode
+ });
+ } else {
+ prev.len += chunk.length;
+ }
+ },
+ result: function() {
+ return prepareTokens(buffer, nodes);
+ }
+ };
+ }
+};
+
+function prepareTokens(str, nodes) {
+ var tokens = [];
+ var nodesOffset = 0;
+ var nodesIndex = 0;
+ var currentNode = nodes ? nodes[nodesIndex].node : null;
+
+ tokenize(str, tokenStream);
+
+ while (!tokenStream.eof) {
+ if (nodes) {
+ while (nodesIndex < nodes.length && nodesOffset + nodes[nodesIndex].len <= tokenStream.tokenStart) {
+ nodesOffset += nodes[nodesIndex++].len;
+ currentNode = nodes[nodesIndex].node;
+ }
+ }
+
+ tokens.push({
+ type: tokenStream.tokenType,
+ value: tokenStream.getTokenValue(),
+ index: tokenStream.tokenIndex, // TODO: remove it, temporary solution
+ balance: tokenStream.balance[tokenStream.tokenIndex], // TODO: remove it, temporary solution
+ node: currentNode
+ });
+ tokenStream.next();
+ // console.log({ ...tokens[tokens.length - 1], node: undefined });
+ }
+
+ return tokens;
+}
+
+module.exports = function(value, syntax) {
+ if (typeof value === 'string') {
+ return prepareTokens(value, null);
+ }
+
+ return syntax.generate(value, astToTokens);
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/search.js b/node_modules/csso/node_modules/css-tree/lib/lexer/search.js
new file mode 100644
index 0000000..7e270ab
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/search.js
@@ -0,0 +1,65 @@
+var List = require('../common/List');
+
+function getFirstMatchNode(matchNode) {
+ if ('node' in matchNode) {
+ return matchNode.node;
+ }
+
+ return getFirstMatchNode(matchNode.match[0]);
+}
+
+function getLastMatchNode(matchNode) {
+ if ('node' in matchNode) {
+ return matchNode.node;
+ }
+
+ return getLastMatchNode(matchNode.match[matchNode.match.length - 1]);
+}
+
+function matchFragments(lexer, ast, match, type, name) {
+ function findFragments(matchNode) {
+ if (matchNode.syntax !== null &&
+ matchNode.syntax.type === type &&
+ matchNode.syntax.name === name) {
+ var start = getFirstMatchNode(matchNode);
+ var end = getLastMatchNode(matchNode);
+
+ lexer.syntax.walk(ast, function(node, item, list) {
+ if (node === start) {
+ var nodes = new List();
+
+ do {
+ nodes.appendData(item.data);
+
+ if (item.data === end) {
+ break;
+ }
+
+ item = item.next;
+ } while (item !== null);
+
+ fragments.push({
+ parent: list,
+ nodes: nodes
+ });
+ }
+ });
+ }
+
+ if (Array.isArray(matchNode.match)) {
+ matchNode.match.forEach(findFragments);
+ }
+ }
+
+ var fragments = [];
+
+ if (match.matched !== null) {
+ findFragments(match.matched);
+ }
+
+ return fragments;
+}
+
+module.exports = {
+ matchFragments: matchFragments
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/structure.js b/node_modules/csso/node_modules/css-tree/lib/lexer/structure.js
new file mode 100644
index 0000000..e1239dd
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/structure.js
@@ -0,0 +1,163 @@
+var List = require('../common/List');
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function isValidNumber(value) {
+ // Number.isInteger(value) && value >= 0
+ return (
+ typeof value === 'number' &&
+ isFinite(value) &&
+ Math.floor(value) === value &&
+ value >= 0
+ );
+}
+
+function isValidLocation(loc) {
+ return (
+ Boolean(loc) &&
+ isValidNumber(loc.offset) &&
+ isValidNumber(loc.line) &&
+ isValidNumber(loc.column)
+ );
+}
+
+function createNodeStructureChecker(type, fields) {
+ return function checkNode(node, warn) {
+ if (!node || node.constructor !== Object) {
+ return warn(node, 'Type of node should be an Object');
+ }
+
+ for (var key in node) {
+ var valid = true;
+
+ if (hasOwnProperty.call(node, key) === false) {
+ continue;
+ }
+
+ if (key === 'type') {
+ if (node.type !== type) {
+ warn(node, 'Wrong node type `' + node.type + '`, expected `' + type + '`');
+ }
+ } else if (key === 'loc') {
+ if (node.loc === null) {
+ continue;
+ } else if (node.loc && node.loc.constructor === Object) {
+ if (typeof node.loc.source !== 'string') {
+ key += '.source';
+ } else if (!isValidLocation(node.loc.start)) {
+ key += '.start';
+ } else if (!isValidLocation(node.loc.end)) {
+ key += '.end';
+ } else {
+ continue;
+ }
+ }
+
+ valid = false;
+ } else if (fields.hasOwnProperty(key)) {
+ for (var i = 0, valid = false; !valid && i < fields[key].length; i++) {
+ var fieldType = fields[key][i];
+
+ switch (fieldType) {
+ case String:
+ valid = typeof node[key] === 'string';
+ break;
+
+ case Boolean:
+ valid = typeof node[key] === 'boolean';
+ break;
+
+ case null:
+ valid = node[key] === null;
+ break;
+
+ default:
+ if (typeof fieldType === 'string') {
+ valid = node[key] && node[key].type === fieldType;
+ } else if (Array.isArray(fieldType)) {
+ valid = node[key] instanceof List;
+ }
+ }
+ }
+ } else {
+ warn(node, 'Unknown field `' + key + '` for ' + type + ' node type');
+ }
+
+ if (!valid) {
+ warn(node, 'Bad value for `' + type + '.' + key + '`');
+ }
+ }
+
+ for (var key in fields) {
+ if (hasOwnProperty.call(fields, key) &&
+ hasOwnProperty.call(node, key) === false) {
+ warn(node, 'Field `' + type + '.' + key + '` is missed');
+ }
+ }
+ };
+}
+
+function processStructure(name, nodeType) {
+ var structure = nodeType.structure;
+ var fields = {
+ type: String,
+ loc: true
+ };
+ var docs = {
+ type: '"' + name + '"'
+ };
+
+ for (var key in structure) {
+ if (hasOwnProperty.call(structure, key) === false) {
+ continue;
+ }
+
+ var docsTypes = [];
+ var fieldTypes = fields[key] = Array.isArray(structure[key])
+ ? structure[key].slice()
+ : [structure[key]];
+
+ for (var i = 0; i < fieldTypes.length; i++) {
+ var fieldType = fieldTypes[i];
+ if (fieldType === String || fieldType === Boolean) {
+ docsTypes.push(fieldType.name);
+ } else if (fieldType === null) {
+ docsTypes.push('null');
+ } else if (typeof fieldType === 'string') {
+ docsTypes.push('<' + fieldType + '>');
+ } else if (Array.isArray(fieldType)) {
+ docsTypes.push('List'); // TODO: use type enum
+ } else {
+ throw new Error('Wrong value `' + fieldType + '` in `' + name + '.' + key + '` structure definition');
+ }
+ }
+
+ docs[key] = docsTypes.join(' | ');
+ }
+
+ return {
+ docs: docs,
+ check: createNodeStructureChecker(name, fields)
+ };
+}
+
+module.exports = {
+ getStructureFromConfig: function(config) {
+ var structure = {};
+
+ if (config.node) {
+ for (var name in config.node) {
+ if (hasOwnProperty.call(config.node, name)) {
+ var nodeType = config.node[name];
+
+ if (nodeType.structure) {
+ structure[name] = processStructure(name, nodeType);
+ } else {
+ throw new Error('Missed `structure` field in `' + name + '` node type definition');
+ }
+ }
+ }
+ }
+
+ return structure;
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/lexer/trace.js b/node_modules/csso/node_modules/css-tree/lib/lexer/trace.js
new file mode 100644
index 0000000..3a45e53
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/lexer/trace.js
@@ -0,0 +1,79 @@
+function getTrace(node) {
+ function shouldPutToTrace(syntax) {
+ if (syntax === null) {
+ return false;
+ }
+
+ return (
+ syntax.type === 'Type' ||
+ syntax.type === 'Property' ||
+ syntax.type === 'Keyword'
+ );
+ }
+
+ function hasMatch(matchNode) {
+ if (Array.isArray(matchNode.match)) {
+ // use for-loop for better perfomance
+ for (var i = 0; i < matchNode.match.length; i++) {
+ if (hasMatch(matchNode.match[i])) {
+ if (shouldPutToTrace(matchNode.syntax)) {
+ result.unshift(matchNode.syntax);
+ }
+
+ return true;
+ }
+ }
+ } else if (matchNode.node === node) {
+ result = shouldPutToTrace(matchNode.syntax)
+ ? [matchNode.syntax]
+ : [];
+
+ return true;
+ }
+
+ return false;
+ }
+
+ var result = null;
+
+ if (this.matched !== null) {
+ hasMatch(this.matched);
+ }
+
+ return result;
+}
+
+function testNode(match, node, fn) {
+ var trace = getTrace.call(match, node);
+
+ if (trace === null) {
+ return false;
+ }
+
+ return trace.some(fn);
+}
+
+function isType(node, type) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Type' && matchNode.name === type;
+ });
+}
+
+function isProperty(node, property) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Property' && matchNode.name === property;
+ });
+}
+
+function isKeyword(node) {
+ return testNode(this, node, function(matchNode) {
+ return matchNode.type === 'Keyword';
+ });
+}
+
+module.exports = {
+ getTrace: getTrace,
+ isType: isType,
+ isProperty: isProperty,
+ isKeyword: isKeyword
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/parser/create.js b/node_modules/csso/node_modules/css-tree/lib/parser/create.js
new file mode 100644
index 0000000..a01f625
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/parser/create.js
@@ -0,0 +1,304 @@
+var OffsetToLocation = require('../common/OffsetToLocation');
+var SyntaxError = require('../common/SyntaxError');
+var TokenStream = require('../common/TokenStream');
+var List = require('../common/List');
+var tokenize = require('../tokenizer');
+var constants = require('../tokenizer/const');
+var { findWhiteSpaceStart, cmpStr } = require('../tokenizer/utils');
+var sequence = require('./sequence');
+var noop = function() {};
+
+var TYPE = constants.TYPE;
+var NAME = constants.NAME;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var HASH = TYPE.Hash;
+var PERCENTAGE = TYPE.Percentage;
+var NUMBER = TYPE.Number;
+var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
+var NULL = 0;
+
+function createParseContext(name) {
+ return function() {
+ return this[name]();
+ };
+}
+
+function processConfig(config) {
+ var parserConfig = {
+ context: {},
+ scope: {},
+ atrule: {},
+ pseudo: {}
+ };
+
+ if (config.parseContext) {
+ for (var name in config.parseContext) {
+ switch (typeof config.parseContext[name]) {
+ case 'function':
+ parserConfig.context[name] = config.parseContext[name];
+ break;
+
+ case 'string':
+ parserConfig.context[name] = createParseContext(config.parseContext[name]);
+ break;
+ }
+ }
+ }
+
+ if (config.scope) {
+ for (var name in config.scope) {
+ parserConfig.scope[name] = config.scope[name];
+ }
+ }
+
+ if (config.atrule) {
+ for (var name in config.atrule) {
+ var atrule = config.atrule[name];
+
+ if (atrule.parse) {
+ parserConfig.atrule[name] = atrule.parse;
+ }
+ }
+ }
+
+ if (config.pseudo) {
+ for (var name in config.pseudo) {
+ var pseudo = config.pseudo[name];
+
+ if (pseudo.parse) {
+ parserConfig.pseudo[name] = pseudo.parse;
+ }
+ }
+ }
+
+ if (config.node) {
+ for (var name in config.node) {
+ parserConfig[name] = config.node[name].parse;
+ }
+ }
+
+ return parserConfig;
+}
+
+module.exports = function createParser(config) {
+ var parser = {
+ scanner: new TokenStream(),
+ locationMap: new OffsetToLocation(),
+
+ filename: '<unknown>',
+ needPositions: false,
+ onParseError: noop,
+ onParseErrorThrow: false,
+ parseAtrulePrelude: true,
+ parseRulePrelude: true,
+ parseValue: true,
+ parseCustomProperty: false,
+
+ readSequence: sequence,
+
+ createList: function() {
+ return new List();
+ },
+ createSingleNodeList: function(node) {
+ return new List().appendData(node);
+ },
+ getFirstListNode: function(list) {
+ return list && list.first();
+ },
+ getLastListNode: function(list) {
+ return list.last();
+ },
+
+ parseWithFallback: function(consumer, fallback) {
+ var startToken = this.scanner.tokenIndex;
+
+ try {
+ return consumer.call(this);
+ } catch (e) {
+ if (this.onParseErrorThrow) {
+ throw e;
+ }
+
+ var fallbackNode = fallback.call(this, startToken);
+
+ this.onParseErrorThrow = true;
+ this.onParseError(e, fallbackNode);
+ this.onParseErrorThrow = false;
+
+ return fallbackNode;
+ }
+ },
+
+ lookupNonWSType: function(offset) {
+ do {
+ var type = this.scanner.lookupType(offset++);
+ if (type !== WHITESPACE) {
+ return type;
+ }
+ } while (type !== NULL);
+
+ return NULL;
+ },
+
+ eat: function(tokenType) {
+ if (this.scanner.tokenType !== tokenType) {
+ var offset = this.scanner.tokenStart;
+ var message = NAME[tokenType] + ' is expected';
+
+ // tweak message and offset
+ switch (tokenType) {
+ case IDENT:
+ // when identifier is expected but there is a function or url
+ if (this.scanner.tokenType === FUNCTION || this.scanner.tokenType === URL) {
+ offset = this.scanner.tokenEnd - 1;
+ message = 'Identifier is expected but function found';
+ } else {
+ message = 'Identifier is expected';
+ }
+ break;
+
+ case HASH:
+ if (this.scanner.isDelim(NUMBERSIGN)) {
+ this.scanner.next();
+ offset++;
+ message = 'Name is expected';
+ }
+ break;
+
+ case PERCENTAGE:
+ if (this.scanner.tokenType === NUMBER) {
+ offset = this.scanner.tokenEnd;
+ message = 'Percent sign is expected';
+ }
+ break;
+
+ default:
+ // when test type is part of another token show error for current position + 1
+ // e.g. eat(HYPHENMINUS) will fail on "-foo", but pointing on "-" is odd
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === tokenType) {
+ offset = offset + 1;
+ }
+ }
+
+ this.error(message, offset);
+ }
+
+ this.scanner.next();
+ },
+
+ consume: function(tokenType) {
+ var value = this.scanner.getTokenValue();
+
+ this.eat(tokenType);
+
+ return value;
+ },
+ consumeFunctionName: function() {
+ var name = this.scanner.source.substring(this.scanner.tokenStart, this.scanner.tokenEnd - 1);
+
+ this.eat(FUNCTION);
+
+ return name;
+ },
+
+ getLocation: function(start, end) {
+ if (this.needPositions) {
+ return this.locationMap.getLocationRange(
+ start,
+ end,
+ this.filename
+ );
+ }
+
+ return null;
+ },
+ getLocationFromList: function(list) {
+ if (this.needPositions) {
+ var head = this.getFirstListNode(list);
+ var tail = this.getLastListNode(list);
+ return this.locationMap.getLocationRange(
+ head !== null ? head.loc.start.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+ tail !== null ? tail.loc.end.offset - this.locationMap.startOffset : this.scanner.tokenStart,
+ this.filename
+ );
+ }
+
+ return null;
+ },
+
+ error: function(message, offset) {
+ var location = typeof offset !== 'undefined' && offset < this.scanner.source.length
+ ? this.locationMap.getLocation(offset)
+ : this.scanner.eof
+ ? this.locationMap.getLocation(findWhiteSpaceStart(this.scanner.source, this.scanner.source.length - 1))
+ : this.locationMap.getLocation(this.scanner.tokenStart);
+
+ throw new SyntaxError(
+ message || 'Unexpected input',
+ this.scanner.source,
+ location.offset,
+ location.line,
+ location.column
+ );
+ }
+ };
+
+ config = processConfig(config || {});
+ for (var key in config) {
+ parser[key] = config[key];
+ }
+
+ return function(source, options) {
+ options = options || {};
+
+ var context = options.context || 'default';
+ var onComment = options.onComment;
+ var ast;
+
+ tokenize(source, parser.scanner);
+ parser.locationMap.setSource(
+ source,
+ options.offset,
+ options.line,
+ options.column
+ );
+
+ parser.filename = options.filename || '<unknown>';
+ parser.needPositions = Boolean(options.positions);
+ parser.onParseError = typeof options.onParseError === 'function' ? options.onParseError : noop;
+ parser.onParseErrorThrow = false;
+ parser.parseAtrulePrelude = 'parseAtrulePrelude' in options ? Boolean(options.parseAtrulePrelude) : true;
+ parser.parseRulePrelude = 'parseRulePrelude' in options ? Boolean(options.parseRulePrelude) : true;
+ parser.parseValue = 'parseValue' in options ? Boolean(options.parseValue) : true;
+ parser.parseCustomProperty = 'parseCustomProperty' in options ? Boolean(options.parseCustomProperty) : false;
+
+ if (!parser.context.hasOwnProperty(context)) {
+ throw new Error('Unknown context `' + context + '`');
+ }
+
+ if (typeof onComment === 'function') {
+ parser.scanner.forEachToken((type, start, end) => {
+ if (type === COMMENT) {
+ const loc = parser.getLocation(start, end);
+ const value = cmpStr(source, end - 2, end, '*/')
+ ? source.slice(start + 2, end - 2)
+ : source.slice(start + 2, end);
+
+ onComment(value, loc);
+ }
+ });
+ }
+
+ ast = parser.context[context].call(parser, options);
+
+ if (!parser.scanner.eof) {
+ parser.error();
+ }
+
+ return ast;
+ };
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/parser/index.js b/node_modules/csso/node_modules/css-tree/lib/parser/index.js
new file mode 100644
index 0000000..1cba9c3
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/parser/index.js
@@ -0,0 +1,4 @@
+var createParser = require('./create');
+var config = require('../syntax/config/parser');
+
+module.exports = createParser(config);
diff --git a/node_modules/csso/node_modules/css-tree/lib/parser/sequence.js b/node_modules/csso/node_modules/css-tree/lib/parser/sequence.js
new file mode 100644
index 0000000..44647e5
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/parser/sequence.js
@@ -0,0 +1,54 @@
+var TYPE = require('../tokenizer').TYPE;
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+
+module.exports = function readSequence(recognizer) {
+ var children = this.createList();
+ var child = null;
+ var context = {
+ recognizer: recognizer,
+ space: null,
+ ignoreWS: false,
+ ignoreWSAfter: false
+ };
+
+ this.scanner.skipSC();
+
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case COMMENT:
+ this.scanner.next();
+ continue;
+
+ case WHITESPACE:
+ if (context.ignoreWS) {
+ this.scanner.next();
+ } else {
+ context.space = this.WhiteSpace();
+ }
+ continue;
+ }
+
+ child = recognizer.getNode.call(this, context);
+
+ if (child === undefined) {
+ break;
+ }
+
+ if (context.space !== null) {
+ children.push(context.space);
+ context.space = null;
+ }
+
+ children.push(child);
+
+ if (context.ignoreWSAfter) {
+ context.ignoreWSAfter = false;
+ context.ignoreWS = true;
+ } else {
+ context.ignoreWS = false;
+ }
+ }
+
+ return children;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/font-face.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/font-face.js
new file mode 100644
index 0000000..ea33ad9
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/font-face.js
@@ -0,0 +1,8 @@
+module.exports = {
+ parse: {
+ prelude: null,
+ block: function() {
+ return this.Block(true);
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/import.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/import.js
new file mode 100644
index 0000000..58bda97
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/import.js
@@ -0,0 +1,40 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var STRING = TYPE.String;
+var IDENT = TYPE.Ident;
+var URL = TYPE.Url;
+var FUNCTION = TYPE.Function;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+module.exports = {
+ parse: {
+ prelude: function() {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ switch (this.scanner.tokenType) {
+ case STRING:
+ children.push(this.String());
+ break;
+
+ case URL:
+ case FUNCTION:
+ children.push(this.Url());
+ break;
+
+ default:
+ this.error('String or url() is expected');
+ }
+
+ if (this.lookupNonWSType(0) === IDENT ||
+ this.lookupNonWSType(0) === LEFTPARENTHESIS) {
+ children.push(this.WhiteSpace());
+ children.push(this.MediaQueryList());
+ }
+
+ return children;
+ },
+ block: null
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/index.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/index.js
new file mode 100644
index 0000000..5098cfb
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/index.js
@@ -0,0 +1,7 @@
+module.exports = {
+ 'font-face': require('./font-face'),
+ 'import': require('./import'),
+ 'media': require('./media'),
+ 'page': require('./page'),
+ 'supports': require('./supports')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/media.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/media.js
new file mode 100644
index 0000000..f148346
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/media.js
@@ -0,0 +1,12 @@
+module.exports = {
+ parse: {
+ prelude: function() {
+ return this.createSingleNodeList(
+ this.MediaQueryList()
+ );
+ },
+ block: function() {
+ return this.Block(false);
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/page.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/page.js
new file mode 100644
index 0000000..aa2229f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/page.js
@@ -0,0 +1,12 @@
+module.exports = {
+ parse: {
+ prelude: function() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ },
+ block: function() {
+ return this.Block(true);
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/supports.js b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/supports.js
new file mode 100644
index 0000000..75fa1d8
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/atrule/supports.js
@@ -0,0 +1,89 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+function consumeRaw() {
+ return this.createSingleNodeList(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+}
+
+function parentheses() {
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType === IDENT &&
+ this.lookupNonWSType(1) === COLON) {
+ return this.createSingleNodeList(
+ this.Declaration()
+ );
+ }
+
+ return readSequence.call(this);
+}
+
+function readSequence() {
+ var children = this.createList();
+ var space = null;
+ var child;
+
+ this.scanner.skipSC();
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE:
+ space = this.WhiteSpace();
+ continue;
+
+ case COMMENT:
+ this.scanner.next();
+ continue;
+
+ case FUNCTION:
+ child = this.Function(consumeRaw, this.scope.AtrulePrelude);
+ break;
+
+ case IDENT:
+ child = this.Identifier();
+ break;
+
+ case LEFTPARENTHESIS:
+ child = this.Parentheses(parentheses, this.scope.AtrulePrelude);
+ break;
+
+ default:
+ break scan;
+ }
+
+ if (space !== null) {
+ children.push(space);
+ space = null;
+ }
+
+ children.push(child);
+ }
+
+ return children;
+}
+
+module.exports = {
+ parse: {
+ prelude: function() {
+ var children = readSequence.call(this);
+
+ if (this.getFirstListNode(children) === null) {
+ this.error('Condition is expected');
+ }
+
+ return children;
+ },
+ block: function() {
+ return this.Block(false);
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/config/lexer.js b/node_modules/csso/node_modules/css-tree/lib/syntax/config/lexer.js
new file mode 100644
index 0000000..2c58b0f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/config/lexer.js
@@ -0,0 +1,9 @@
+var data = require('../../../data');
+
+module.exports = {
+ generic: true,
+ types: data.types,
+ atrules: data.atrules,
+ properties: data.properties,
+ node: require('../node')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/config/mix.js b/node_modules/csso/node_modules/css-tree/lib/syntax/config/mix.js
new file mode 100644
index 0000000..8eb57ec
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/config/mix.js
@@ -0,0 +1,140 @@
+const hasOwnProperty = Object.prototype.hasOwnProperty;
+const shape = {
+ generic: true,
+ types: appendOrAssign,
+ atrules: {
+ prelude: appendOrAssignOrNull,
+ descriptors: appendOrAssignOrNull
+ },
+ properties: appendOrAssign,
+ parseContext: assign,
+ scope: deepAssign,
+ atrule: ['parse'],
+ pseudo: ['parse'],
+ node: ['name', 'structure', 'parse', 'generate', 'walkContext']
+};
+
+function isObject(value) {
+ return value && value.constructor === Object;
+}
+
+function copy(value) {
+ return isObject(value)
+ ? Object.assign({}, value)
+ : value;
+}
+
+function assign(dest, src) {
+ return Object.assign(dest, src);
+}
+
+function deepAssign(dest, src) {
+ for (const key in src) {
+ if (hasOwnProperty.call(src, key)) {
+ if (isObject(dest[key])) {
+ deepAssign(dest[key], copy(src[key]));
+ } else {
+ dest[key] = copy(src[key]);
+ }
+ }
+ }
+
+ return dest;
+}
+
+function append(a, b) {
+ if (typeof b === 'string' && /^\s*\|/.test(b)) {
+ return typeof a === 'string'
+ ? a + b
+ : b.replace(/^\s*\|\s*/, '');
+ }
+
+ return b || null;
+}
+
+function appendOrAssign(a, b) {
+ if (typeof b === 'string') {
+ return append(a, b);
+ }
+
+ const result = Object.assign({}, a);
+ for (let key in b) {
+ if (hasOwnProperty.call(b, key)) {
+ result[key] = append(hasOwnProperty.call(a, key) ? a[key] : undefined, b[key]);
+ }
+ }
+
+ return result;
+}
+
+function appendOrAssignOrNull(a, b) {
+ const result = appendOrAssign(a, b);
+
+ return !isObject(result) || Object.keys(result).length
+ ? result
+ : null;
+}
+
+function mix(dest, src, shape) {
+ for (const key in shape) {
+ if (hasOwnProperty.call(shape, key) === false) {
+ continue;
+ }
+
+ if (shape[key] === true) {
+ if (key in src) {
+ if (hasOwnProperty.call(src, key)) {
+ dest[key] = copy(src[key]);
+ }
+ }
+ } else if (shape[key]) {
+ if (typeof shape[key] === 'function') {
+ const fn = shape[key];
+ dest[key] = fn({}, dest[key]);
+ dest[key] = fn(dest[key] || {}, src[key]);
+ } else if (isObject(shape[key])) {
+ const result = {};
+
+ for (let name in dest[key]) {
+ result[name] = mix({}, dest[key][name], shape[key]);
+ }
+
+ for (let name in src[key]) {
+ result[name] = mix(result[name] || {}, src[key][name], shape[key]);
+ }
+
+ dest[key] = result;
+ } else if (Array.isArray(shape[key])) {
+ const res = {};
+ const innerShape = shape[key].reduce(function(s, k) {
+ s[k] = true;
+ return s;
+ }, {});
+
+ for (const [name, value] of Object.entries(dest[key] || {})) {
+ res[name] = {};
+ if (value) {
+ mix(res[name], value, innerShape);
+ }
+ }
+
+ for (const name in src[key]) {
+ if (hasOwnProperty.call(src[key], name)) {
+ if (!res[name]) {
+ res[name] = {};
+ }
+
+ if (src[key] && src[key][name]) {
+ mix(res[name], src[key][name], innerShape);
+ }
+ }
+ }
+
+ dest[key] = res;
+ }
+ }
+ }
+ return dest;
+}
+
+module.exports = (dest, src) => mix(dest, src, shape);
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/config/parser.js b/node_modules/csso/node_modules/css-tree/lib/syntax/config/parser.js
new file mode 100644
index 0000000..88d2921
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/config/parser.js
@@ -0,0 +1,25 @@
+module.exports = {
+ parseContext: {
+ default: 'StyleSheet',
+ stylesheet: 'StyleSheet',
+ atrule: 'Atrule',
+ atrulePrelude: function(options) {
+ return this.AtrulePrelude(options.atrule ? String(options.atrule) : null);
+ },
+ mediaQueryList: 'MediaQueryList',
+ mediaQuery: 'MediaQuery',
+ rule: 'Rule',
+ selectorList: 'SelectorList',
+ selector: 'Selector',
+ block: function() {
+ return this.Block(true);
+ },
+ declarationList: 'DeclarationList',
+ declaration: 'Declaration',
+ value: 'Value'
+ },
+ scope: require('../scope'),
+ atrule: require('../atrule'),
+ pseudo: require('../pseudo'),
+ node: require('../node')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/config/walker.js b/node_modules/csso/node_modules/css-tree/lib/syntax/config/walker.js
new file mode 100644
index 0000000..3a030de
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/config/walker.js
@@ -0,0 +1,3 @@
+module.exports = {
+ node: require('../node')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/create.js b/node_modules/csso/node_modules/css-tree/lib/syntax/create.js
new file mode 100644
index 0000000..68b6d16
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/create.js
@@ -0,0 +1,77 @@
+var List = require('../common/List');
+var SyntaxError = require('../common/SyntaxError');
+var TokenStream = require('../common/TokenStream');
+var Lexer = require('../lexer/Lexer');
+var definitionSyntax = require('../definition-syntax');
+var tokenize = require('../tokenizer');
+var createParser = require('../parser/create');
+var createGenerator = require('../generator/create');
+var createConvertor = require('../convertor/create');
+var createWalker = require('../walker/create');
+var clone = require('../utils/clone');
+var names = require('../utils/names');
+var mix = require('./config/mix');
+
+function createSyntax(config) {
+ var parse = createParser(config);
+ var walk = createWalker(config);
+ var generate = createGenerator(config);
+ var convert = createConvertor(walk);
+
+ var syntax = {
+ List: List,
+ SyntaxError: SyntaxError,
+ TokenStream: TokenStream,
+ Lexer: Lexer,
+
+ vendorPrefix: names.vendorPrefix,
+ keyword: names.keyword,
+ property: names.property,
+ isCustomProperty: names.isCustomProperty,
+
+ definitionSyntax: definitionSyntax,
+ lexer: null,
+ createLexer: function(config) {
+ return new Lexer(config, syntax, syntax.lexer.structure);
+ },
+
+ tokenize: tokenize,
+ parse: parse,
+ walk: walk,
+ generate: generate,
+
+ find: walk.find,
+ findLast: walk.findLast,
+ findAll: walk.findAll,
+
+ clone: clone,
+ fromPlainObject: convert.fromPlainObject,
+ toPlainObject: convert.toPlainObject,
+
+ createSyntax: function(config) {
+ return createSyntax(mix({}, config));
+ },
+ fork: function(extension) {
+ var base = mix({}, config); // copy of config
+ return createSyntax(
+ typeof extension === 'function'
+ ? extension(base, Object.assign)
+ : mix(base, extension)
+ );
+ }
+ };
+
+ syntax.lexer = new Lexer({
+ generic: true,
+ types: config.types,
+ atrules: config.atrules,
+ properties: config.properties,
+ node: config.node
+ }, syntax);
+
+ return syntax;
+};
+
+exports.create = function(config) {
+ return createSyntax(mix({}, config));
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/function/expression.js b/node_modules/csso/node_modules/css-tree/lib/syntax/function/expression.js
new file mode 100644
index 0000000..e76f631
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/function/expression.js
@@ -0,0 +1,7 @@
+// legacy IE function
+// expression( <any-value> )
+module.exports = function() {
+ return this.createSingleNodeList(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/function/var.js b/node_modules/csso/node_modules/css-tree/lib/syntax/function/var.js
new file mode 100644
index 0000000..ba55b48
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/function/var.js
@@ -0,0 +1,43 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('../node/Raw').mode;
+
+var COMMA = TYPE.Comma;
+var WHITESPACE = TYPE.WhiteSpace;
+
+// var( <ident> , <value>? )
+module.exports = function() {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ // NOTE: Don't check more than a first argument is an ident, rest checks are for lexer
+ children.push(this.Identifier());
+
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType === COMMA) {
+ children.push(this.Operator());
+
+ const startIndex = this.scanner.tokenIndex;
+ const value = this.parseCustomProperty
+ ? this.Value(null)
+ : this.Raw(this.scanner.tokenIndex, rawMode.exclamationMarkOrSemicolon, false);
+
+ if (value.type === 'Value' && value.children.isEmpty()) {
+ for (let offset = startIndex - this.scanner.tokenIndex; offset <= 0; offset++) {
+ if (this.scanner.lookupType(offset) === WHITESPACE) {
+ value.children.appendData({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+ });
+ break;
+ }
+ }
+ }
+
+ children.push(value);
+ }
+
+ return children;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/index.js b/node_modules/csso/node_modules/css-tree/lib/syntax/index.js
new file mode 100644
index 0000000..065ea04
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/index.js
@@ -0,0 +1,21 @@
+function merge() {
+ var dest = {};
+
+ for (var i = 0; i < arguments.length; i++) {
+ var src = arguments[i];
+ for (var key in src) {
+ dest[key] = src[key];
+ }
+ }
+
+ return dest;
+}
+
+module.exports = require('./create').create(
+ merge(
+ require('./config/lexer'),
+ require('./config/parser'),
+ require('./config/walker')
+ )
+);
+module.exports.version = require('../../package.json').version;
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/AnPlusB.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AnPlusB.js
new file mode 100644
index 0000000..d33d21a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AnPlusB.js
@@ -0,0 +1,297 @@
+var cmpChar = require('../../tokenizer').cmpChar;
+var isDigit = require('../../tokenizer').isDigit;
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var N = 0x006E; // U+006E LATIN SMALL LETTER N (n)
+var DISALLOW_SIGN = true;
+var ALLOW_SIGN = false;
+
+function checkInteger(offset, disallowSign) {
+ var pos = this.scanner.tokenStart + offset;
+ var code = this.scanner.source.charCodeAt(pos);
+
+ if (code === PLUSSIGN || code === HYPHENMINUS) {
+ if (disallowSign) {
+ this.error('Number sign is not allowed');
+ }
+ pos++;
+ }
+
+ for (; pos < this.scanner.tokenEnd; pos++) {
+ if (!isDigit(this.scanner.source.charCodeAt(pos))) {
+ this.error('Integer is expected', pos);
+ }
+ }
+}
+
+function checkTokenIsInteger(disallowSign) {
+ return checkInteger.call(this, 0, disallowSign);
+}
+
+function expectCharCode(offset, code) {
+ if (!cmpChar(this.scanner.source, this.scanner.tokenStart + offset, code)) {
+ var msg = '';
+
+ switch (code) {
+ case N:
+ msg = 'N is expected';
+ break;
+ case HYPHENMINUS:
+ msg = 'HyphenMinus is expected';
+ break;
+ }
+
+ this.error(msg, this.scanner.tokenStart + offset);
+ }
+}
+
+// ... <signed-integer>
+// ... ['+' | '-'] <signless-integer>
+function consumeB() {
+ var offset = 0;
+ var sign = 0;
+ var type = this.scanner.tokenType;
+
+ while (type === WHITESPACE || type === COMMENT) {
+ type = this.scanner.lookupType(++offset);
+ }
+
+ if (type !== NUMBER) {
+ if (this.scanner.isDelim(PLUSSIGN, offset) ||
+ this.scanner.isDelim(HYPHENMINUS, offset)) {
+ sign = this.scanner.isDelim(PLUSSIGN, offset) ? PLUSSIGN : HYPHENMINUS;
+
+ do {
+ type = this.scanner.lookupType(++offset);
+ } while (type === WHITESPACE || type === COMMENT);
+
+ if (type !== NUMBER) {
+ this.scanner.skip(offset);
+ checkTokenIsInteger.call(this, DISALLOW_SIGN);
+ }
+ } else {
+ return null;
+ }
+ }
+
+ if (offset > 0) {
+ this.scanner.skip(offset);
+ }
+
+ if (sign === 0) {
+ type = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+ if (type !== PLUSSIGN && type !== HYPHENMINUS) {
+ this.error('Number sign is expected');
+ }
+ }
+
+ checkTokenIsInteger.call(this, sign !== 0);
+ return sign === HYPHENMINUS ? '-' + this.consume(NUMBER) : this.consume(NUMBER);
+}
+
+// An+B microsyntax https://www.w3.org/TR/css-syntax-3/#anb
+module.exports = {
+ name: 'AnPlusB',
+ structure: {
+ a: [String, null],
+ b: [String, null]
+ },
+ parse: function() {
+ /* eslint-disable brace-style*/
+ var start = this.scanner.tokenStart;
+ var a = null;
+ var b = null;
+
+ // <integer>
+ if (this.scanner.tokenType === NUMBER) {
+ checkTokenIsInteger.call(this, ALLOW_SIGN);
+ b = this.consume(NUMBER);
+ }
+
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ // -n- <signless-integer>
+ // <dashndashdigit-ident>
+ else if (this.scanner.tokenType === IDENT && cmpChar(this.scanner.source, this.scanner.tokenStart, HYPHENMINUS)) {
+ a = '-1';
+
+ expectCharCode.call(this, 1, N);
+
+ switch (this.scanner.getTokenLength()) {
+ // -n
+ // -n <signed-integer>
+ // -n ['+' | '-'] <signless-integer>
+ case 2:
+ this.scanner.next();
+ b = consumeB.call(this);
+ break;
+
+ // -n- <signless-integer>
+ case 3:
+ expectCharCode.call(this, 2, HYPHENMINUS);
+
+ this.scanner.next();
+ this.scanner.skipSC();
+
+ checkTokenIsInteger.call(this, DISALLOW_SIGN);
+
+ b = '-' + this.consume(NUMBER);
+ break;
+
+ // <dashndashdigit-ident>
+ default:
+ expectCharCode.call(this, 2, HYPHENMINUS);
+ checkInteger.call(this, 3, DISALLOW_SIGN);
+ this.scanner.next();
+
+ b = this.scanner.substrToCursor(start + 2);
+ }
+ }
+
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ // '+'? n- <signless-integer>
+ // '+'? <ndashdigit-ident>
+ else if (this.scanner.tokenType === IDENT || (this.scanner.isDelim(PLUSSIGN) && this.scanner.lookupType(1) === IDENT)) {
+ var sign = 0;
+ a = '1';
+
+ // just ignore a plus
+ if (this.scanner.isDelim(PLUSSIGN)) {
+ sign = 1;
+ this.scanner.next();
+ }
+
+ expectCharCode.call(this, 0, N);
+
+ switch (this.scanner.getTokenLength()) {
+ // '+'? n
+ // '+'? n <signed-integer>
+ // '+'? n ['+' | '-'] <signless-integer>
+ case 1:
+ this.scanner.next();
+ b = consumeB.call(this);
+ break;
+
+ // '+'? n- <signless-integer>
+ case 2:
+ expectCharCode.call(this, 1, HYPHENMINUS);
+
+ this.scanner.next();
+ this.scanner.skipSC();
+
+ checkTokenIsInteger.call(this, DISALLOW_SIGN);
+
+ b = '-' + this.consume(NUMBER);
+ break;
+
+ // '+'? <ndashdigit-ident>
+ default:
+ expectCharCode.call(this, 1, HYPHENMINUS);
+ checkInteger.call(this, 2, DISALLOW_SIGN);
+ this.scanner.next();
+
+ b = this.scanner.substrToCursor(start + sign + 1);
+ }
+ }
+
+ // <ndashdigit-dimension>
+ // <ndash-dimension> <signless-integer>
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ else if (this.scanner.tokenType === DIMENSION) {
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+ var sign = code === PLUSSIGN || code === HYPHENMINUS;
+
+ for (var i = this.scanner.tokenStart + sign; i < this.scanner.tokenEnd; i++) {
+ if (!isDigit(this.scanner.source.charCodeAt(i))) {
+ break;
+ }
+ }
+
+ if (i === this.scanner.tokenStart + sign) {
+ this.error('Integer is expected', this.scanner.tokenStart + sign);
+ }
+
+ expectCharCode.call(this, i - this.scanner.tokenStart, N);
+ a = this.scanner.source.substring(start, i);
+
+ // <n-dimension>
+ // <n-dimension> <signed-integer>
+ // <n-dimension> ['+' | '-'] <signless-integer>
+ if (i + 1 === this.scanner.tokenEnd) {
+ this.scanner.next();
+ b = consumeB.call(this);
+ } else {
+ expectCharCode.call(this, i - this.scanner.tokenStart + 1, HYPHENMINUS);
+
+ // <ndash-dimension> <signless-integer>
+ if (i + 2 === this.scanner.tokenEnd) {
+ this.scanner.next();
+ this.scanner.skipSC();
+ checkTokenIsInteger.call(this, DISALLOW_SIGN);
+ b = '-' + this.consume(NUMBER);
+ }
+ // <ndashdigit-dimension>
+ else {
+ checkInteger.call(this, i - this.scanner.tokenStart + 2, DISALLOW_SIGN);
+ this.scanner.next();
+ b = this.scanner.substrToCursor(i + 1);
+ }
+ }
+ } else {
+ this.error();
+ }
+
+ if (a !== null && a.charCodeAt(0) === PLUSSIGN) {
+ a = a.substr(1);
+ }
+
+ if (b !== null && b.charCodeAt(0) === PLUSSIGN) {
+ b = b.substr(1);
+ }
+
+ return {
+ type: 'AnPlusB',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ a: a,
+ b: b
+ };
+ },
+ generate: function(node) {
+ var a = node.a !== null && node.a !== undefined;
+ var b = node.b !== null && node.b !== undefined;
+
+ if (a) {
+ this.chunk(
+ node.a === '+1' ? '+n' : // eslint-disable-line operator-linebreak, indent
+ node.a === '1' ? 'n' : // eslint-disable-line operator-linebreak, indent
+ node.a === '-1' ? '-n' : // eslint-disable-line operator-linebreak, indent
+ node.a + 'n' // eslint-disable-line operator-linebreak, indent
+ );
+
+ if (b) {
+ b = String(node.b);
+ if (b.charAt(0) === '-' || b.charAt(0) === '+') {
+ this.chunk(b.charAt(0));
+ this.chunk(b.substr(1));
+ } else {
+ this.chunk('+');
+ this.chunk(b);
+ }
+ }
+ } else {
+ this.chunk(String(node.b));
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Atrule.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Atrule.js
new file mode 100644
index 0000000..284499f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Atrule.js
@@ -0,0 +1,107 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var ATKEYWORD = TYPE.AtKeyword;
+var SEMICOLON = TYPE.Semicolon;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+var RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;
+
+function consumeRaw(startToken) {
+ return this.Raw(startToken, rawMode.leftCurlyBracketOrSemicolon, true);
+}
+
+function isDeclarationBlockAtrule() {
+ for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) {
+ if (type === RIGHTCURLYBRACKET) {
+ return true;
+ }
+
+ if (type === LEFTCURLYBRACKET ||
+ type === ATKEYWORD) {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+module.exports = {
+ name: 'Atrule',
+ structure: {
+ name: String,
+ prelude: ['AtrulePrelude', 'Raw', null],
+ block: ['Block', null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var nameLowerCase;
+ var prelude = null;
+ var block = null;
+
+ this.eat(ATKEYWORD);
+
+ name = this.scanner.substrToCursor(start + 1);
+ nameLowerCase = name.toLowerCase();
+ this.scanner.skipSC();
+
+ // parse prelude
+ if (this.scanner.eof === false &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET &&
+ this.scanner.tokenType !== SEMICOLON) {
+ if (this.parseAtrulePrelude) {
+ prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw);
+
+ // turn empty AtrulePrelude into null
+ if (prelude.type === 'AtrulePrelude' && prelude.children.head === null) {
+ prelude = null;
+ }
+ } else {
+ prelude = consumeRaw.call(this, this.scanner.tokenIndex);
+ }
+
+ this.scanner.skipSC();
+ }
+
+ switch (this.scanner.tokenType) {
+ case SEMICOLON:
+ this.scanner.next();
+ break;
+
+ case LEFTCURLYBRACKET:
+ if (this.atrule.hasOwnProperty(nameLowerCase) &&
+ typeof this.atrule[nameLowerCase].block === 'function') {
+ block = this.atrule[nameLowerCase].block.call(this);
+ } else {
+ // TODO: should consume block content as Raw?
+ block = this.Block(isDeclarationBlockAtrule.call(this));
+ }
+
+ break;
+ }
+
+ return {
+ type: 'Atrule',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ prelude: prelude,
+ block: block
+ };
+ },
+ generate: function(node) {
+ this.chunk('@');
+ this.chunk(node.name);
+
+ if (node.prelude !== null) {
+ this.chunk(' ');
+ this.node(node.prelude);
+ }
+
+ if (node.block) {
+ this.node(node.block);
+ } else {
+ this.chunk(';');
+ }
+ },
+ walkContext: 'atrule'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js
new file mode 100644
index 0000000..f9f21ff
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AtrulePrelude.js
@@ -0,0 +1,51 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var SEMICOLON = TYPE.Semicolon;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+
+module.exports = {
+ name: 'AtrulePrelude',
+ structure: {
+ children: [[]]
+ },
+ parse: function(name) {
+ var children = null;
+
+ if (name !== null) {
+ name = name.toLowerCase();
+ }
+
+ this.scanner.skipSC();
+
+ if (this.atrule.hasOwnProperty(name) &&
+ typeof this.atrule[name].prelude === 'function') {
+ // custom consumer
+ children = this.atrule[name].prelude.call(this);
+ } else {
+ // default consumer
+ children = this.readSequence(this.scope.AtrulePrelude);
+ }
+
+ this.scanner.skipSC();
+
+ if (this.scanner.eof !== true &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET &&
+ this.scanner.tokenType !== SEMICOLON) {
+ this.error('Semicolon or block is expected');
+ }
+
+ if (children === null) {
+ children = this.createList();
+ }
+
+ return {
+ type: 'AtrulePrelude',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ },
+ walkContext: 'atrulePrelude'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/AttributeSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AttributeSelector.js
new file mode 100644
index 0000000..656446c
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/AttributeSelector.js
@@ -0,0 +1,165 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var STRING = TYPE.String;
+var COLON = TYPE.Colon;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;
+var DOLLARSIGN = 0x0024; // U+0024 DOLLAR SIGN ($)
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var EQUALSSIGN = 0x003D; // U+003D EQUALS SIGN (=)
+var CIRCUMFLEXACCENT = 0x005E; // U+005E (^)
+var VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
+var TILDE = 0x007E; // U+007E TILDE (~)
+
+function getAttributeName() {
+ if (this.scanner.eof) {
+ this.error('Unexpected end of input');
+ }
+
+ var start = this.scanner.tokenStart;
+ var expectIdent = false;
+ var checkColon = true;
+
+ if (this.scanner.isDelim(ASTERISK)) {
+ expectIdent = true;
+ checkColon = false;
+ this.scanner.next();
+ } else if (!this.scanner.isDelim(VERTICALLINE)) {
+ this.eat(IDENT);
+ }
+
+ if (this.scanner.isDelim(VERTICALLINE)) {
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 1) !== EQUALSSIGN) {
+ this.scanner.next();
+ this.eat(IDENT);
+ } else if (expectIdent) {
+ this.error('Identifier is expected', this.scanner.tokenEnd);
+ }
+ } else if (expectIdent) {
+ this.error('Vertical line is expected');
+ }
+
+ if (checkColon && this.scanner.tokenType === COLON) {
+ this.scanner.next();
+ this.eat(IDENT);
+ }
+
+ return {
+ type: 'Identifier',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+}
+
+function getOperator() {
+ var start = this.scanner.tokenStart;
+ var code = this.scanner.source.charCodeAt(start);
+
+ if (code !== EQUALSSIGN && // =
+ code !== TILDE && // ~=
+ code !== CIRCUMFLEXACCENT && // ^=
+ code !== DOLLARSIGN && // $=
+ code !== ASTERISK && // *=
+ code !== VERTICALLINE // |=
+ ) {
+ this.error('Attribute selector (=, ~=, ^=, $=, *=, |=) is expected');
+ }
+
+ this.scanner.next();
+
+ if (code !== EQUALSSIGN) {
+ if (!this.scanner.isDelim(EQUALSSIGN)) {
+ this.error('Equal sign is expected');
+ }
+
+ this.scanner.next();
+ }
+
+ return this.scanner.substrToCursor(start);
+}
+
+// '[' <wq-name> ']'
+// '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'
+module.exports = {
+ name: 'AttributeSelector',
+ structure: {
+ name: 'Identifier',
+ matcher: [String, null],
+ value: ['String', 'Identifier', null],
+ flags: [String, null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var matcher = null;
+ var value = null;
+ var flags = null;
+
+ this.eat(LEFTSQUAREBRACKET);
+ this.scanner.skipSC();
+
+ name = getAttributeName.call(this);
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType !== RIGHTSQUAREBRACKET) {
+ // avoid case `[name i]`
+ if (this.scanner.tokenType !== IDENT) {
+ matcher = getOperator.call(this);
+
+ this.scanner.skipSC();
+
+ value = this.scanner.tokenType === STRING
+ ? this.String()
+ : this.Identifier();
+
+ this.scanner.skipSC();
+ }
+
+ // attribute flags
+ if (this.scanner.tokenType === IDENT) {
+ flags = this.scanner.getTokenValue();
+ this.scanner.next();
+
+ this.scanner.skipSC();
+ }
+ }
+
+ this.eat(RIGHTSQUAREBRACKET);
+
+ return {
+ type: 'AttributeSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ matcher: matcher,
+ value: value,
+ flags: flags
+ };
+ },
+ generate: function(node) {
+ var flagsPrefix = ' ';
+
+ this.chunk('[');
+ this.node(node.name);
+
+ if (node.matcher !== null) {
+ this.chunk(node.matcher);
+
+ if (node.value !== null) {
+ this.node(node.value);
+
+ // space between string and flags is not required
+ if (node.value.type === 'String') {
+ flagsPrefix = '';
+ }
+ }
+ }
+
+ if (node.flags !== null) {
+ this.chunk(flagsPrefix);
+ this.chunk(node.flags);
+ }
+
+ this.chunk(']');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Block.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Block.js
new file mode 100644
index 0000000..b4fc6ba
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Block.js
@@ -0,0 +1,91 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var SEMICOLON = TYPE.Semicolon;
+var ATKEYWORD = TYPE.AtKeyword;
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+var RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;
+
+function consumeRaw(startToken) {
+ return this.Raw(startToken, null, true);
+}
+function consumeRule() {
+ return this.parseWithFallback(this.Rule, consumeRaw);
+}
+function consumeRawDeclaration(startToken) {
+ return this.Raw(startToken, rawMode.semicolonIncluded, true);
+}
+function consumeDeclaration() {
+ if (this.scanner.tokenType === SEMICOLON) {
+ return consumeRawDeclaration.call(this, this.scanner.tokenIndex);
+ }
+
+ var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
+
+ if (this.scanner.tokenType === SEMICOLON) {
+ this.scanner.next();
+ }
+
+ return node;
+}
+
+module.exports = {
+ name: 'Block',
+ structure: {
+ children: [[
+ 'Atrule',
+ 'Rule',
+ 'Declaration'
+ ]]
+ },
+ parse: function(isDeclaration) {
+ var consumer = isDeclaration ? consumeDeclaration : consumeRule;
+
+ var start = this.scanner.tokenStart;
+ var children = this.createList();
+
+ this.eat(LEFTCURLYBRACKET);
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case RIGHTCURLYBRACKET:
+ break scan;
+
+ case WHITESPACE:
+ case COMMENT:
+ this.scanner.next();
+ break;
+
+ case ATKEYWORD:
+ children.push(this.parseWithFallback(this.Atrule, consumeRaw));
+ break;
+
+ default:
+ children.push(consumer.call(this));
+ }
+ }
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTCURLYBRACKET);
+ }
+
+ return {
+ type: 'Block',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('{');
+ this.children(node, function(prev) {
+ if (prev.type === 'Declaration') {
+ this.chunk(';');
+ }
+ });
+ this.chunk('}');
+ },
+ walkContext: 'block'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Brackets.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Brackets.js
new file mode 100644
index 0000000..a81c474
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Brackets.js
@@ -0,0 +1,34 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var RIGHTSQUAREBRACKET = TYPE.RightSquareBracket;
+
+module.exports = {
+ name: 'Brackets',
+ structure: {
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var children = null;
+
+ this.eat(LEFTSQUAREBRACKET);
+
+ children = readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTSQUAREBRACKET);
+ }
+
+ return {
+ type: 'Brackets',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('[');
+ this.children(node);
+ this.chunk(']');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDC.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDC.js
new file mode 100644
index 0000000..885b258
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDC.js
@@ -0,0 +1,19 @@
+var CDC = require('../../tokenizer').TYPE.CDC;
+
+module.exports = {
+ name: 'CDC',
+ structure: [],
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(CDC); // -->
+
+ return {
+ type: 'CDC',
+ loc: this.getLocation(start, this.scanner.tokenStart)
+ };
+ },
+ generate: function() {
+ this.chunk('-->');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDO.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDO.js
new file mode 100644
index 0000000..f701be7
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/CDO.js
@@ -0,0 +1,19 @@
+var CDO = require('../../tokenizer').TYPE.CDO;
+
+module.exports = {
+ name: 'CDO',
+ structure: [],
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(CDO); // <!--
+
+ return {
+ type: 'CDO',
+ loc: this.getLocation(start, this.scanner.tokenStart)
+ };
+ },
+ generate: function() {
+ this.chunk('<!--');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/ClassSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/ClassSelector.js
new file mode 100644
index 0000000..c84d69b
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/ClassSelector.js
@@ -0,0 +1,29 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+// '.' ident
+module.exports = {
+ name: 'ClassSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ if (!this.scanner.isDelim(FULLSTOP)) {
+ this.error('Full stop is expected');
+ }
+
+ this.scanner.next();
+
+ return {
+ type: 'ClassSelector',
+ loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd),
+ name: this.consume(IDENT)
+ };
+ },
+ generate: function(node) {
+ this.chunk('.');
+ this.chunk(node.name);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Combinator.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Combinator.js
new file mode 100644
index 0000000..308ca81
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Combinator.js
@@ -0,0 +1,55 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+var GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)
+var TILDE = 0x007E; // U+007E TILDE (~)
+
+// + | > | ~ | /deep/
+module.exports = {
+ name: 'Combinator',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ switch (code) {
+ case GREATERTHANSIGN:
+ case PLUSSIGN:
+ case TILDE:
+ this.scanner.next();
+ break;
+
+ case SOLIDUS:
+ this.scanner.next();
+
+ if (this.scanner.tokenType !== IDENT || this.scanner.lookupValue(0, 'deep') === false) {
+ this.error('Identifier `deep` is expected');
+ }
+
+ this.scanner.next();
+
+ if (!this.scanner.isDelim(SOLIDUS)) {
+ this.error('Solidus is expected');
+ }
+
+ this.scanner.next();
+ break;
+
+ default:
+ this.error('Combinator is expected');
+ }
+
+ return {
+ type: 'Combinator',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Comment.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Comment.js
new file mode 100644
index 0000000..9f0e2f4
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Comment.js
@@ -0,0 +1,36 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var COMMENT = TYPE.Comment;
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+
+// '/*' .* '*/'
+module.exports = {
+ name: 'Comment',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var end = this.scanner.tokenEnd;
+
+ this.eat(COMMENT);
+
+ if ((end - start + 2) >= 2 &&
+ this.scanner.source.charCodeAt(end - 2) === ASTERISK &&
+ this.scanner.source.charCodeAt(end - 1) === SOLIDUS) {
+ end -= 2;
+ }
+
+ return {
+ type: 'Comment',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start + 2, end)
+ };
+ },
+ generate: function(node) {
+ this.chunk('/*');
+ this.chunk(node.value);
+ this.chunk('*/');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Declaration.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Declaration.js
new file mode 100644
index 0000000..0792836
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Declaration.js
@@ -0,0 +1,169 @@
+var isCustomProperty = require('../../utils/names').isCustomProperty;
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var IDENT = TYPE.Ident;
+var HASH = TYPE.Hash;
+var COLON = TYPE.Colon;
+var SEMICOLON = TYPE.Semicolon;
+var DELIM = TYPE.Delim;
+var WHITESPACE = TYPE.WhiteSpace;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
+var DOLLARSIGN = 0x0024; // U+0024 DOLLAR SIGN ($)
+var AMPERSAND = 0x0026; // U+0026 ANPERSAND (&)
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+
+function consumeValueRaw(startToken) {
+ return this.Raw(startToken, rawMode.exclamationMarkOrSemicolon, true);
+}
+
+function consumeCustomPropertyRaw(startToken) {
+ return this.Raw(startToken, rawMode.exclamationMarkOrSemicolon, false);
+}
+
+function consumeValue() {
+ var startValueToken = this.scanner.tokenIndex;
+ var value = this.Value();
+
+ if (value.type !== 'Raw' &&
+ this.scanner.eof === false &&
+ this.scanner.tokenType !== SEMICOLON &&
+ this.scanner.isDelim(EXCLAMATIONMARK) === false &&
+ this.scanner.isBalanceEdge(startValueToken) === false) {
+ this.error();
+ }
+
+ return value;
+}
+
+module.exports = {
+ name: 'Declaration',
+ structure: {
+ important: [Boolean, String],
+ property: String,
+ value: ['Value', 'Raw']
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var startToken = this.scanner.tokenIndex;
+ var property = readProperty.call(this);
+ var customProperty = isCustomProperty(property);
+ var parseValue = customProperty ? this.parseCustomProperty : this.parseValue;
+ var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw;
+ var important = false;
+ var value;
+
+ this.scanner.skipSC();
+ this.eat(COLON);
+
+ const valueStart = this.scanner.tokenIndex;
+
+ if (!customProperty) {
+ this.scanner.skipSC();
+ }
+
+ if (parseValue) {
+ value = this.parseWithFallback(consumeValue, consumeRaw);
+ } else {
+ value = consumeRaw.call(this, this.scanner.tokenIndex);
+ }
+
+ if (customProperty && value.type === 'Value' && value.children.isEmpty()) {
+ for (let offset = valueStart - this.scanner.tokenIndex; offset <= 0; offset++) {
+ if (this.scanner.lookupType(offset) === WHITESPACE) {
+ value.children.appendData({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+ });
+ break;
+ }
+ }
+ }
+
+ if (this.scanner.isDelim(EXCLAMATIONMARK)) {
+ important = getImportant.call(this);
+ this.scanner.skipSC();
+ }
+
+ // Do not include semicolon to range per spec
+ // https://drafts.csswg.org/css-syntax/#declaration-diagram
+
+ if (this.scanner.eof === false &&
+ this.scanner.tokenType !== SEMICOLON &&
+ this.scanner.isBalanceEdge(startToken) === false) {
+ this.error();
+ }
+
+ return {
+ type: 'Declaration',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ important: important,
+ property: property,
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.property);
+ this.chunk(':');
+ this.node(node.value);
+
+ if (node.important) {
+ this.chunk(node.important === true ? '!important' : '!' + node.important);
+ }
+ },
+ walkContext: 'declaration'
+};
+
+function readProperty() {
+ var start = this.scanner.tokenStart;
+ var prefix = 0;
+
+ // hacks
+ if (this.scanner.tokenType === DELIM) {
+ switch (this.scanner.source.charCodeAt(this.scanner.tokenStart)) {
+ case ASTERISK:
+ case DOLLARSIGN:
+ case PLUSSIGN:
+ case NUMBERSIGN:
+ case AMPERSAND:
+ this.scanner.next();
+ break;
+
+ // TODO: not sure we should support this hack
+ case SOLIDUS:
+ this.scanner.next();
+ if (this.scanner.isDelim(SOLIDUS)) {
+ this.scanner.next();
+ }
+ break;
+ }
+ }
+
+ if (prefix) {
+ this.scanner.skip(prefix);
+ }
+
+ if (this.scanner.tokenType === HASH) {
+ this.eat(HASH);
+ } else {
+ this.eat(IDENT);
+ }
+
+ return this.scanner.substrToCursor(start);
+}
+
+// ! ws* important
+function getImportant() {
+ this.eat(DELIM);
+ this.scanner.skipSC();
+
+ var important = this.consume(IDENT);
+
+ // store original value in case it differ from `important`
+ // for better original source restoring and hacks like `!ie` support
+ return important === 'important' ? true : important;
+}
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/DeclarationList.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/DeclarationList.js
new file mode 100644
index 0000000..084b5c6
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/DeclarationList.js
@@ -0,0 +1,49 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var SEMICOLON = TYPE.Semicolon;
+
+function consumeRaw(startToken) {
+ return this.Raw(startToken, rawMode.semicolonIncluded, true);
+}
+
+module.exports = {
+ name: 'DeclarationList',
+ structure: {
+ children: [[
+ 'Declaration'
+ ]]
+ },
+ parse: function() {
+ var children = this.createList();
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE:
+ case COMMENT:
+ case SEMICOLON:
+ this.scanner.next();
+ break;
+
+ default:
+ children.push(this.parseWithFallback(this.Declaration, consumeRaw));
+ }
+ }
+
+ return {
+ type: 'DeclarationList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function(prev) {
+ if (prev.type === 'Declaration') {
+ this.chunk(';');
+ }
+ });
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Dimension.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Dimension.js
new file mode 100644
index 0000000..186f6ee
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Dimension.js
@@ -0,0 +1,29 @@
+var consumeNumber = require('../../tokenizer/utils').consumeNumber;
+var TYPE = require('../../tokenizer').TYPE;
+
+var DIMENSION = TYPE.Dimension;
+
+module.exports = {
+ name: 'Dimension',
+ structure: {
+ value: String,
+ unit: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var numberEnd = consumeNumber(this.scanner.source, start);
+
+ this.eat(DIMENSION);
+
+ return {
+ type: 'Dimension',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start, numberEnd),
+ unit: this.scanner.source.substring(numberEnd, this.scanner.tokenStart)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ this.chunk(node.unit);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Function.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Function.js
new file mode 100644
index 0000000..9e6b420
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Function.js
@@ -0,0 +1,40 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// <function-token> <sequence> )
+module.exports = {
+ name: 'Function',
+ structure: {
+ name: String,
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var name = this.consumeFunctionName();
+ var nameLowerCase = name.toLowerCase();
+ var children;
+
+ children = recognizer.hasOwnProperty(nameLowerCase)
+ ? recognizer[nameLowerCase].call(this, recognizer)
+ : readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTPARENTHESIS);
+ }
+
+ return {
+ type: 'Function',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ },
+ walkContext: 'function'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Hash.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Hash.js
new file mode 100644
index 0000000..5632636
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Hash.js
@@ -0,0 +1,26 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var HASH = TYPE.Hash;
+
+// '#' ident
+module.exports = {
+ name: 'Hash',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.eat(HASH);
+
+ return {
+ type: 'Hash',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start + 1)
+ };
+ },
+ generate: function(node) {
+ this.chunk('#');
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/IdSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/IdSelector.js
new file mode 100644
index 0000000..b35fd96
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/IdSelector.js
@@ -0,0 +1,27 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var HASH = TYPE.Hash;
+
+// <hash-token>
+module.exports = {
+ name: 'IdSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ // TODO: check value is an ident
+ this.eat(HASH);
+
+ return {
+ type: 'IdSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start + 1)
+ };
+ },
+ generate: function(node) {
+ this.chunk('#');
+ this.chunk(node.name);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Identifier.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Identifier.js
new file mode 100644
index 0000000..3fce2b4
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Identifier.js
@@ -0,0 +1,20 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+
+module.exports = {
+ name: 'Identifier',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ return {
+ type: 'Identifier',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ name: this.consume(IDENT)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaFeature.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaFeature.js
new file mode 100644
index 0000000..bdc7bc2
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaFeature.js
@@ -0,0 +1,76 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+var COLON = TYPE.Colon;
+var DELIM = TYPE.Delim;
+
+module.exports = {
+ name: 'MediaFeature',
+ structure: {
+ name: String,
+ value: ['Identifier', 'Number', 'Dimension', 'Ratio', null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var name;
+ var value = null;
+
+ this.eat(LEFTPARENTHESIS);
+ this.scanner.skipSC();
+
+ name = this.consume(IDENT);
+ this.scanner.skipSC();
+
+ if (this.scanner.tokenType !== RIGHTPARENTHESIS) {
+ this.eat(COLON);
+ this.scanner.skipSC();
+
+ switch (this.scanner.tokenType) {
+ case NUMBER:
+ if (this.lookupNonWSType(1) === DELIM) {
+ value = this.Ratio();
+ } else {
+ value = this.Number();
+ }
+
+ break;
+
+ case DIMENSION:
+ value = this.Dimension();
+ break;
+
+ case IDENT:
+ value = this.Identifier();
+
+ break;
+
+ default:
+ this.error('Number, dimension, ratio or identifier is expected');
+ }
+
+ this.scanner.skipSC();
+ }
+
+ this.eat(RIGHTPARENTHESIS);
+
+ return {
+ type: 'MediaFeature',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk('(');
+ this.chunk(node.name);
+ if (node.value !== null) {
+ this.chunk(':');
+ this.node(node.value);
+ }
+ this.chunk(')');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQuery.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQuery.js
new file mode 100644
index 0000000..e0c74ce
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQuery.js
@@ -0,0 +1,68 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var IDENT = TYPE.Ident;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+
+module.exports = {
+ name: 'MediaQuery',
+ structure: {
+ children: [[
+ 'Identifier',
+ 'MediaFeature',
+ 'WhiteSpace'
+ ]]
+ },
+ parse: function() {
+ this.scanner.skipSC();
+
+ var children = this.createList();
+ var child = null;
+ var space = null;
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case COMMENT:
+ this.scanner.next();
+ continue;
+
+ case WHITESPACE:
+ space = this.WhiteSpace();
+ continue;
+
+ case IDENT:
+ child = this.Identifier();
+ break;
+
+ case LEFTPARENTHESIS:
+ child = this.MediaFeature();
+ break;
+
+ default:
+ break scan;
+ }
+
+ if (space !== null) {
+ children.push(space);
+ space = null;
+ }
+
+ children.push(child);
+ }
+
+ if (child === null) {
+ this.error('Identifier or parenthesis is expected');
+ }
+
+ return {
+ type: 'MediaQuery',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQueryList.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQueryList.js
new file mode 100644
index 0000000..a25a965
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/MediaQueryList.js
@@ -0,0 +1,36 @@
+var COMMA = require('../../tokenizer').TYPE.Comma;
+
+module.exports = {
+ name: 'MediaQueryList',
+ structure: {
+ children: [[
+ 'MediaQuery'
+ ]]
+ },
+ parse: function(relative) {
+ var children = this.createList();
+
+ this.scanner.skipSC();
+
+ while (!this.scanner.eof) {
+ children.push(this.MediaQuery(relative));
+
+ if (this.scanner.tokenType !== COMMA) {
+ break;
+ }
+
+ this.scanner.next();
+ }
+
+ return {
+ type: 'MediaQueryList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function() {
+ this.chunk(',');
+ });
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Nth.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Nth.js
new file mode 100644
index 0000000..43835cc
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Nth.js
@@ -0,0 +1,51 @@
+module.exports = {
+ name: 'Nth',
+ structure: {
+ nth: ['AnPlusB', 'Identifier'],
+ selector: ['SelectorList', null]
+ },
+ parse: function(allowOfClause) {
+ this.scanner.skipSC();
+
+ var start = this.scanner.tokenStart;
+ var end = start;
+ var selector = null;
+ var query;
+
+ if (this.scanner.lookupValue(0, 'odd') || this.scanner.lookupValue(0, 'even')) {
+ query = this.Identifier();
+ } else {
+ query = this.AnPlusB();
+ }
+
+ this.scanner.skipSC();
+
+ if (allowOfClause && this.scanner.lookupValue(0, 'of')) {
+ this.scanner.next();
+
+ selector = this.SelectorList();
+
+ if (this.needPositions) {
+ end = this.getLastListNode(selector.children).loc.end.offset;
+ }
+ } else {
+ if (this.needPositions) {
+ end = query.loc.end.offset;
+ }
+ }
+
+ return {
+ type: 'Nth',
+ loc: this.getLocation(start, end),
+ nth: query,
+ selector: selector
+ };
+ },
+ generate: function(node) {
+ this.node(node.nth);
+ if (node.selector !== null) {
+ this.chunk(' of ');
+ this.node(node.selector);
+ }
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Number.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Number.js
new file mode 100644
index 0000000..1c01936
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Number.js
@@ -0,0 +1,18 @@
+var NUMBER = require('../../tokenizer').TYPE.Number;
+
+module.exports = {
+ name: 'Number',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ return {
+ type: 'Number',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ value: this.consume(NUMBER)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Operator.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Operator.js
new file mode 100644
index 0000000..d94259a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Operator.js
@@ -0,0 +1,21 @@
+// '/' | '*' | ',' | ':' | '+' | '-'
+module.exports = {
+ name: 'Operator',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ this.scanner.next();
+
+ return {
+ type: 'Operator',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Parentheses.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Parentheses.js
new file mode 100644
index 0000000..19efe6f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Parentheses.js
@@ -0,0 +1,34 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+module.exports = {
+ name: 'Parentheses',
+ structure: {
+ children: [[]]
+ },
+ parse: function(readSequence, recognizer) {
+ var start = this.scanner.tokenStart;
+ var children = null;
+
+ this.eat(LEFTPARENTHESIS);
+
+ children = readSequence.call(this, recognizer);
+
+ if (!this.scanner.eof) {
+ this.eat(RIGHTPARENTHESIS);
+ }
+
+ return {
+ type: 'Parentheses',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Percentage.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Percentage.js
new file mode 100644
index 0000000..99b7641
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Percentage.js
@@ -0,0 +1,27 @@
+var consumeNumber = require('../../tokenizer/utils').consumeNumber;
+var TYPE = require('../../tokenizer').TYPE;
+
+var PERCENTAGE = TYPE.Percentage;
+
+module.exports = {
+ name: 'Percentage',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var numberEnd = consumeNumber(this.scanner.source, start);
+
+ this.eat(PERCENTAGE);
+
+ return {
+ type: 'Percentage',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.source.substring(start, numberEnd)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ this.chunk('%');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js
new file mode 100644
index 0000000..282e236
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoClassSelector.js
@@ -0,0 +1,61 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// : [ <ident> | <function-token> <any-value>? ) ]
+module.exports = {
+ name: 'PseudoClassSelector',
+ structure: {
+ name: String,
+ children: [['Raw'], null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = null;
+ var name;
+ var nameLowerCase;
+
+ this.eat(COLON);
+
+ if (this.scanner.tokenType === FUNCTION) {
+ name = this.consumeFunctionName();
+ nameLowerCase = name.toLowerCase();
+
+ if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+ this.scanner.skipSC();
+ children = this.pseudo[nameLowerCase].call(this);
+ this.scanner.skipSC();
+ } else {
+ children = this.createList();
+ children.push(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ }
+
+ this.eat(RIGHTPARENTHESIS);
+ } else {
+ name = this.consume(IDENT);
+ }
+
+ return {
+ type: 'PseudoClassSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk(':');
+ this.chunk(node.name);
+
+ if (node.children !== null) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+ },
+ walkContext: 'function'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js
new file mode 100644
index 0000000..b736cea
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/PseudoElementSelector.js
@@ -0,0 +1,62 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var FUNCTION = TYPE.Function;
+var COLON = TYPE.Colon;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// :: [ <ident> | <function-token> <any-value>? ) ]
+module.exports = {
+ name: 'PseudoElementSelector',
+ structure: {
+ name: String,
+ children: [['Raw'], null]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = null;
+ var name;
+ var nameLowerCase;
+
+ this.eat(COLON);
+ this.eat(COLON);
+
+ if (this.scanner.tokenType === FUNCTION) {
+ name = this.consumeFunctionName();
+ nameLowerCase = name.toLowerCase();
+
+ if (this.pseudo.hasOwnProperty(nameLowerCase)) {
+ this.scanner.skipSC();
+ children = this.pseudo[nameLowerCase].call(this);
+ this.scanner.skipSC();
+ } else {
+ children = this.createList();
+ children.push(
+ this.Raw(this.scanner.tokenIndex, null, false)
+ );
+ }
+
+ this.eat(RIGHTPARENTHESIS);
+ } else {
+ name = this.consume(IDENT);
+ }
+
+ return {
+ type: 'PseudoElementSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: name,
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.chunk('::');
+ this.chunk(node.name);
+
+ if (node.children !== null) {
+ this.chunk('(');
+ this.children(node);
+ this.chunk(')');
+ }
+ },
+ walkContext: 'function'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Ratio.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Ratio.js
new file mode 100644
index 0000000..940fee5
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Ratio.js
@@ -0,0 +1,66 @@
+var isDigit = require('../../tokenizer').isDigit;
+var TYPE = require('../../tokenizer').TYPE;
+
+var NUMBER = TYPE.Number;
+var DELIM = TYPE.Delim;
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+
+// Terms of <ratio> should be a positive numbers (not zero or negative)
+// (see https://drafts.csswg.org/mediaqueries-3/#values)
+// However, -o-min-device-pixel-ratio takes fractional values as a ratio's term
+// and this is using by various sites. Therefore we relax checking on parse
+// to test a term is unsigned number without an exponent part.
+// Additional checking may be applied on lexer validation.
+function consumeNumber() {
+ this.scanner.skipWS();
+
+ var value = this.consume(NUMBER);
+
+ for (var i = 0; i < value.length; i++) {
+ var code = value.charCodeAt(i);
+ if (!isDigit(code) && code !== FULLSTOP) {
+ this.error('Unsigned number is expected', this.scanner.tokenStart - value.length + i);
+ }
+ }
+
+ if (Number(value) === 0) {
+ this.error('Zero number is not allowed', this.scanner.tokenStart - value.length);
+ }
+
+ return value;
+}
+
+// <positive-integer> S* '/' S* <positive-integer>
+module.exports = {
+ name: 'Ratio',
+ structure: {
+ left: String,
+ right: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var left = consumeNumber.call(this);
+ var right;
+
+ this.scanner.skipWS();
+
+ if (!this.scanner.isDelim(SOLIDUS)) {
+ this.error('Solidus is expected');
+ }
+ this.eat(DELIM);
+ right = consumeNumber.call(this);
+
+ return {
+ type: 'Ratio',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ left: left,
+ right: right
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.left);
+ this.chunk('/');
+ this.chunk(node.right);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Raw.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Raw.js
new file mode 100644
index 0000000..a47deb4
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Raw.js
@@ -0,0 +1,87 @@
+var tokenizer = require('../../tokenizer');
+var TYPE = tokenizer.TYPE;
+
+var WhiteSpace = TYPE.WhiteSpace;
+var Semicolon = TYPE.Semicolon;
+var LeftCurlyBracket = TYPE.LeftCurlyBracket;
+var Delim = TYPE.Delim;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+function getOffsetExcludeWS() {
+ if (this.scanner.tokenIndex > 0) {
+ if (this.scanner.lookupType(-1) === WhiteSpace) {
+ return this.scanner.tokenIndex > 1
+ ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
+ : this.scanner.firstCharOffset;
+ }
+ }
+
+ return this.scanner.tokenStart;
+}
+
+// 0, 0, false
+function balanceEnd() {
+ return 0;
+}
+
+// LEFTCURLYBRACKET, 0, false
+function leftCurlyBracket(tokenType) {
+ return tokenType === LeftCurlyBracket ? 1 : 0;
+}
+
+// LEFTCURLYBRACKET, SEMICOLON, false
+function leftCurlyBracketOrSemicolon(tokenType) {
+ return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
+}
+
+// EXCLAMATIONMARK, SEMICOLON, false
+function exclamationMarkOrSemicolon(tokenType, source, offset) {
+ if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK) {
+ return 1;
+ }
+
+ return tokenType === Semicolon ? 1 : 0;
+}
+
+// 0, SEMICOLON, true
+function semicolonIncluded(tokenType) {
+ return tokenType === Semicolon ? 2 : 0;
+}
+
+module.exports = {
+ name: 'Raw',
+ structure: {
+ value: String
+ },
+ parse: function(startToken, mode, excludeWhiteSpace) {
+ var startOffset = this.scanner.getTokenStart(startToken);
+ var endOffset;
+
+ this.scanner.skip(
+ this.scanner.getRawLength(startToken, mode || balanceEnd)
+ );
+
+ if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
+ endOffset = getOffsetExcludeWS.call(this);
+ } else {
+ endOffset = this.scanner.tokenStart;
+ }
+
+ return {
+ type: 'Raw',
+ loc: this.getLocation(startOffset, endOffset),
+ value: this.scanner.source.substring(startOffset, endOffset)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ },
+
+ mode: {
+ default: balanceEnd,
+ leftCurlyBracket: leftCurlyBracket,
+ leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
+ exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
+ semicolonIncluded: semicolonIncluded
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Rule.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Rule.js
new file mode 100644
index 0000000..2f1aaa2
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Rule.js
@@ -0,0 +1,54 @@
+var TYPE = require('../../tokenizer').TYPE;
+var rawMode = require('./Raw').mode;
+
+var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
+
+function consumeRaw(startToken) {
+ return this.Raw(startToken, rawMode.leftCurlyBracket, true);
+}
+
+function consumePrelude() {
+ var prelude = this.SelectorList();
+
+ if (prelude.type !== 'Raw' &&
+ this.scanner.eof === false &&
+ this.scanner.tokenType !== LEFTCURLYBRACKET) {
+ this.error();
+ }
+
+ return prelude;
+}
+
+module.exports = {
+ name: 'Rule',
+ structure: {
+ prelude: ['SelectorList', 'Raw'],
+ block: ['Block']
+ },
+ parse: function() {
+ var startToken = this.scanner.tokenIndex;
+ var startOffset = this.scanner.tokenStart;
+ var prelude;
+ var block;
+
+ if (this.parseRulePrelude) {
+ prelude = this.parseWithFallback(consumePrelude, consumeRaw);
+ } else {
+ prelude = consumeRaw.call(this, startToken);
+ }
+
+ block = this.Block(true);
+
+ return {
+ type: 'Rule',
+ loc: this.getLocation(startOffset, this.scanner.tokenStart),
+ prelude: prelude,
+ block: block
+ };
+ },
+ generate: function(node) {
+ this.node(node.prelude);
+ this.node(node.block);
+ },
+ walkContext: 'rule'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Selector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Selector.js
new file mode 100644
index 0000000..a1b17f3
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Selector.js
@@ -0,0 +1,32 @@
+module.exports = {
+ name: 'Selector',
+ structure: {
+ children: [[
+ 'TypeSelector',
+ 'IdSelector',
+ 'ClassSelector',
+ 'AttributeSelector',
+ 'PseudoClassSelector',
+ 'PseudoElementSelector',
+ 'Combinator',
+ 'WhiteSpace'
+ ]]
+ },
+ parse: function() {
+ var children = this.readSequence(this.scope.Selector);
+
+ // nothing were consumed
+ if (this.getFirstListNode(children) === null) {
+ this.error('Selector is expected');
+ }
+
+ return {
+ type: 'Selector',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/SelectorList.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/SelectorList.js
new file mode 100644
index 0000000..70dd7c5
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/SelectorList.js
@@ -0,0 +1,39 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var COMMA = TYPE.Comma;
+
+module.exports = {
+ name: 'SelectorList',
+ structure: {
+ children: [[
+ 'Selector',
+ 'Raw'
+ ]]
+ },
+ parse: function() {
+ var children = this.createList();
+
+ while (!this.scanner.eof) {
+ children.push(this.Selector());
+
+ if (this.scanner.tokenType === COMMA) {
+ this.scanner.next();
+ continue;
+ }
+
+ break;
+ }
+
+ return {
+ type: 'SelectorList',
+ loc: this.getLocationFromList(children),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node, function() {
+ this.chunk(',');
+ });
+ },
+ walkContext: 'selector'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/String.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/String.js
new file mode 100644
index 0000000..d3b8cc1
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/String.js
@@ -0,0 +1,18 @@
+var STRING = require('../../tokenizer').TYPE.String;
+
+module.exports = {
+ name: 'String',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ return {
+ type: 'String',
+ loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ value: this.consume(STRING)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/StyleSheet.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/StyleSheet.js
new file mode 100644
index 0000000..db332cf
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/StyleSheet.js
@@ -0,0 +1,81 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var WHITESPACE = TYPE.WhiteSpace;
+var COMMENT = TYPE.Comment;
+var ATKEYWORD = TYPE.AtKeyword;
+var CDO = TYPE.CDO;
+var CDC = TYPE.CDC;
+var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
+
+function consumeRaw(startToken) {
+ return this.Raw(startToken, null, false);
+}
+
+module.exports = {
+ name: 'StyleSheet',
+ structure: {
+ children: [[
+ 'Comment',
+ 'CDO',
+ 'CDC',
+ 'Atrule',
+ 'Rule',
+ 'Raw'
+ ]]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = this.createList();
+ var child;
+
+ scan:
+ while (!this.scanner.eof) {
+ switch (this.scanner.tokenType) {
+ case WHITESPACE:
+ this.scanner.next();
+ continue;
+
+ case COMMENT:
+ // ignore comments except exclamation comments (i.e. /*! .. */) on top level
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {
+ this.scanner.next();
+ continue;
+ }
+
+ child = this.Comment();
+ break;
+
+ case CDO: // <!--
+ child = this.CDO();
+ break;
+
+ case CDC: // -->
+ child = this.CDC();
+ break;
+
+ // CSS Syntax Module Level 3
+ // §2.2 Error handling
+ // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
+ case ATKEYWORD:
+ child = this.parseWithFallback(this.Atrule, consumeRaw);
+ break;
+
+ // Anything else starts a qualified rule ...
+ default:
+ child = this.parseWithFallback(this.Rule, consumeRaw);
+ }
+
+ children.push(child);
+ }
+
+ return {
+ type: 'StyleSheet',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ },
+ walkContext: 'stylesheet'
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/TypeSelector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/TypeSelector.js
new file mode 100644
index 0000000..c8a692c
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/TypeSelector.js
@@ -0,0 +1,53 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
+
+function eatIdentifierOrAsterisk() {
+ if (this.scanner.tokenType !== IDENT &&
+ this.scanner.isDelim(ASTERISK) === false) {
+ this.error('Identifier or asterisk is expected');
+ }
+
+ this.scanner.next();
+}
+
+// ident
+// ident|ident
+// ident|*
+// *
+// *|ident
+// *|*
+// |ident
+// |*
+module.exports = {
+ name: 'TypeSelector',
+ structure: {
+ name: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ if (this.scanner.isDelim(VERTICALLINE)) {
+ this.scanner.next();
+ eatIdentifierOrAsterisk.call(this);
+ } else {
+ eatIdentifierOrAsterisk.call(this);
+
+ if (this.scanner.isDelim(VERTICALLINE)) {
+ this.scanner.next();
+ eatIdentifierOrAsterisk.call(this);
+ }
+ }
+
+ return {
+ type: 'TypeSelector',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ name: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.name);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/UnicodeRange.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/UnicodeRange.js
new file mode 100644
index 0000000..f3ca607
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/UnicodeRange.js
@@ -0,0 +1,173 @@
+var isHexDigit = require('../../tokenizer').isHexDigit;
+var cmpChar = require('../../tokenizer').cmpChar;
+var TYPE = require('../../tokenizer').TYPE;
+var NAME = require('../../tokenizer').NAME;
+
+var IDENT = TYPE.Ident;
+var NUMBER = TYPE.Number;
+var DIMENSION = TYPE.Dimension;
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
+var U = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+function eatHexSequence(offset, allowDash) {
+ for (var pos = this.scanner.tokenStart + offset, len = 0; pos < this.scanner.tokenEnd; pos++) {
+ var code = this.scanner.source.charCodeAt(pos);
+
+ if (code === HYPHENMINUS && allowDash && len !== 0) {
+ if (eatHexSequence.call(this, offset + len + 1, false) === 0) {
+ this.error();
+ }
+
+ return -1;
+ }
+
+ if (!isHexDigit(code)) {
+ this.error(
+ allowDash && len !== 0
+ ? 'HyphenMinus' + (len < 6 ? ' or hex digit' : '') + ' is expected'
+ : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),
+ pos
+ );
+ }
+
+ if (++len > 6) {
+ this.error('Too many hex digits', pos);
+ };
+ }
+
+ this.scanner.next();
+ return len;
+}
+
+function eatQuestionMarkSequence(max) {
+ var count = 0;
+
+ while (this.scanner.isDelim(QUESTIONMARK)) {
+ if (++count > max) {
+ this.error('Too many question marks');
+ }
+
+ this.scanner.next();
+ }
+}
+
+function startsWith(code) {
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== code) {
+ this.error(NAME[code] + ' is expected');
+ }
+}
+
+// https://drafts.csswg.org/css-syntax/#urange
+// Informally, the <urange> production has three forms:
+// U+0001
+// Defines a range consisting of a single code point, in this case the code point "1".
+// U+0001-00ff
+// Defines a range of codepoints between the first and the second value, in this case
+// the range between "1" and "ff" (255 in decimal) inclusive.
+// U+00??
+// Defines a range of codepoints where the "?" characters range over all hex digits,
+// in this case defining the same as the value U+0000-00ff.
+// In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
+//
+// <urange> =
+// u '+' <ident-token> '?'* |
+// u <dimension-token> '?'* |
+// u <number-token> '?'* |
+// u <number-token> <dimension-token> |
+// u <number-token> <number-token> |
+// u '+' '?'+
+function scanUnicodeRange() {
+ var hexLength = 0;
+
+ // u '+' <ident-token> '?'*
+ // u '+' '?'+
+ if (this.scanner.isDelim(PLUSSIGN)) {
+ this.scanner.next();
+
+ if (this.scanner.tokenType === IDENT) {
+ hexLength = eatHexSequence.call(this, 0, true);
+ if (hexLength > 0) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ }
+ return;
+ }
+
+ if (this.scanner.isDelim(QUESTIONMARK)) {
+ this.scanner.next();
+ eatQuestionMarkSequence.call(this, 5);
+ return;
+ }
+
+ this.error('Hex digit or question mark is expected');
+ return;
+ }
+
+ // u <number-token> '?'*
+ // u <number-token> <dimension-token>
+ // u <number-token> <number-token>
+ if (this.scanner.tokenType === NUMBER) {
+ startsWith.call(this, PLUSSIGN);
+ hexLength = eatHexSequence.call(this, 1, true);
+
+ if (this.scanner.isDelim(QUESTIONMARK)) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ return;
+ }
+
+ if (this.scanner.tokenType === DIMENSION ||
+ this.scanner.tokenType === NUMBER) {
+ startsWith.call(this, HYPHENMINUS);
+ eatHexSequence.call(this, 1, false);
+ return;
+ }
+
+ return;
+ }
+
+ // u <dimension-token> '?'*
+ if (this.scanner.tokenType === DIMENSION) {
+ startsWith.call(this, PLUSSIGN);
+ hexLength = eatHexSequence.call(this, 1, true);
+
+ if (hexLength > 0) {
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
+ }
+
+ return;
+ }
+
+ this.error();
+}
+
+module.exports = {
+ name: 'UnicodeRange',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+
+ // U or u
+ if (!cmpChar(this.scanner.source, start, U)) {
+ this.error('U is expected');
+ }
+
+ if (!cmpChar(this.scanner.source, start + 1, PLUSSIGN)) {
+ this.error('Plus sign is expected');
+ }
+
+ this.scanner.next();
+ scanUnicodeRange.call(this);
+
+ return {
+ type: 'UnicodeRange',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: this.scanner.substrToCursor(start)
+ };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Url.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Url.js
new file mode 100644
index 0000000..91c6f59
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Url.js
@@ -0,0 +1,69 @@
+var isWhiteSpace = require('../../tokenizer').isWhiteSpace;
+var cmpStr = require('../../tokenizer').cmpStr;
+var TYPE = require('../../tokenizer').TYPE;
+
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var RIGHTPARENTHESIS = TYPE.RightParenthesis;
+
+// <url-token> | <function-token> <string> )
+module.exports = {
+ name: 'Url',
+ structure: {
+ value: ['String', 'Raw']
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var value;
+
+ switch (this.scanner.tokenType) {
+ case URL:
+ var rawStart = start + 4;
+ var rawEnd = this.scanner.tokenEnd - 1;
+
+ while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawStart))) {
+ rawStart++;
+ }
+
+ while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawEnd - 1))) {
+ rawEnd--;
+ }
+
+ value = {
+ type: 'Raw',
+ loc: this.getLocation(rawStart, rawEnd),
+ value: this.scanner.source.substring(rawStart, rawEnd)
+ };
+
+ this.eat(URL);
+ break;
+
+ case FUNCTION:
+ if (!cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')) {
+ this.error('Function name must be `url`');
+ }
+
+ this.eat(FUNCTION);
+ this.scanner.skipSC();
+ value = this.String();
+ this.scanner.skipSC();
+ this.eat(RIGHTPARENTHESIS);
+ break;
+
+ default:
+ this.error('Url or Function is expected');
+ }
+
+ return {
+ type: 'Url',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ value: value
+ };
+ },
+ generate: function(node) {
+ this.chunk('url');
+ this.chunk('(');
+ this.node(node.value);
+ this.chunk(')');
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/Value.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Value.js
new file mode 100644
index 0000000..6dcb265
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/Value.js
@@ -0,0 +1,19 @@
+module.exports = {
+ name: 'Value',
+ structure: {
+ children: [[]]
+ },
+ parse: function() {
+ var start = this.scanner.tokenStart;
+ var children = this.readSequence(this.scope.Value);
+
+ return {
+ type: 'Value',
+ loc: this.getLocation(start, this.scanner.tokenStart),
+ children: children
+ };
+ },
+ generate: function(node) {
+ this.children(node);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/WhiteSpace.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/WhiteSpace.js
new file mode 100644
index 0000000..0c6a363
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/WhiteSpace.js
@@ -0,0 +1,26 @@
+var WHITESPACE = require('../../tokenizer').TYPE.WhiteSpace;
+var SPACE = Object.freeze({
+ type: 'WhiteSpace',
+ loc: null,
+ value: ' '
+});
+
+module.exports = {
+ name: 'WhiteSpace',
+ structure: {
+ value: String
+ },
+ parse: function() {
+ this.eat(WHITESPACE);
+ return SPACE;
+
+ // return {
+ // type: 'WhiteSpace',
+ // loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd),
+ // value: this.consume(WHITESPACE)
+ // };
+ },
+ generate: function(node) {
+ this.chunk(node.value);
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/node/index.js b/node_modules/csso/node_modules/css-tree/lib/syntax/node/index.js
new file mode 100644
index 0000000..182b2cf
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/node/index.js
@@ -0,0 +1,42 @@
+module.exports = {
+ AnPlusB: require('./AnPlusB'),
+ Atrule: require('./Atrule'),
+ AtrulePrelude: require('./AtrulePrelude'),
+ AttributeSelector: require('./AttributeSelector'),
+ Block: require('./Block'),
+ Brackets: require('./Brackets'),
+ CDC: require('./CDC'),
+ CDO: require('./CDO'),
+ ClassSelector: require('./ClassSelector'),
+ Combinator: require('./Combinator'),
+ Comment: require('./Comment'),
+ Declaration: require('./Declaration'),
+ DeclarationList: require('./DeclarationList'),
+ Dimension: require('./Dimension'),
+ Function: require('./Function'),
+ Hash: require('./Hash'),
+ Identifier: require('./Identifier'),
+ IdSelector: require('./IdSelector'),
+ MediaFeature: require('./MediaFeature'),
+ MediaQuery: require('./MediaQuery'),
+ MediaQueryList: require('./MediaQueryList'),
+ Nth: require('./Nth'),
+ Number: require('./Number'),
+ Operator: require('./Operator'),
+ Parentheses: require('./Parentheses'),
+ Percentage: require('./Percentage'),
+ PseudoClassSelector: require('./PseudoClassSelector'),
+ PseudoElementSelector: require('./PseudoElementSelector'),
+ Ratio: require('./Ratio'),
+ Raw: require('./Raw'),
+ Rule: require('./Rule'),
+ Selector: require('./Selector'),
+ SelectorList: require('./SelectorList'),
+ String: require('./String'),
+ StyleSheet: require('./StyleSheet'),
+ TypeSelector: require('./TypeSelector'),
+ UnicodeRange: require('./UnicodeRange'),
+ Url: require('./Url'),
+ Value: require('./Value'),
+ WhiteSpace: require('./WhiteSpace')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nth.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nth.js
new file mode 100644
index 0000000..c201e7e
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nth.js
@@ -0,0 +1,9 @@
+var DISALLOW_OF_CLAUSE = false;
+
+module.exports = {
+ parse: function nth() {
+ return this.createSingleNodeList(
+ this.Nth(DISALLOW_OF_CLAUSE)
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js
new file mode 100644
index 0000000..527bd1a
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/nthWithOfClause.js
@@ -0,0 +1,9 @@
+var ALLOW_OF_CLAUSE = true;
+
+module.exports = {
+ parse: function nthWithOfClause() {
+ return this.createSingleNodeList(
+ this.Nth(ALLOW_OF_CLAUSE)
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js
new file mode 100644
index 0000000..7f87d08
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js
@@ -0,0 +1,7 @@
+module.exports = {
+ parse: function selectorList() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/dir.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/dir.js
new file mode 100644
index 0000000..10f7232
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/dir.js
@@ -0,0 +1,7 @@
+module.exports = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.Identifier()
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/has.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/has.js
new file mode 100644
index 0000000..0e6b583
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/has.js
@@ -0,0 +1,7 @@
+module.exports = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.SelectorList()
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/index.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/index.js
new file mode 100644
index 0000000..eb68aef
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/index.js
@@ -0,0 +1,12 @@
+module.exports = {
+ 'dir': require('./dir'),
+ 'has': require('./has'),
+ 'lang': require('./lang'),
+ 'matches': require('./matches'),
+ 'not': require('./not'),
+ 'nth-child': require('./nth-child'),
+ 'nth-last-child': require('./nth-last-child'),
+ 'nth-last-of-type': require('./nth-last-of-type'),
+ 'nth-of-type': require('./nth-of-type'),
+ 'slotted': require('./slotted')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/lang.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/lang.js
new file mode 100644
index 0000000..10f7232
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/lang.js
@@ -0,0 +1,7 @@
+module.exports = {
+ parse: function() {
+ return this.createSingleNodeList(
+ this.Identifier()
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/matches.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/matches.js
new file mode 100644
index 0000000..43aa085
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/matches.js
@@ -0,0 +1 @@
+module.exports = require('./common/selectorList');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/not.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/not.js
new file mode 100644
index 0000000..43aa085
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/not.js
@@ -0,0 +1 @@
+module.exports = require('./common/selectorList');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-child.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-child.js
new file mode 100644
index 0000000..ed62028
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-child.js
@@ -0,0 +1 @@
+module.exports = require('./common/nthWithOfClause');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js
new file mode 100644
index 0000000..ed62028
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-child.js
@@ -0,0 +1 @@
+module.exports = require('./common/nthWithOfClause');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js
new file mode 100644
index 0000000..9417189
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-last-of-type.js
@@ -0,0 +1 @@
+module.exports = require('./common/nth');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js
new file mode 100644
index 0000000..9417189
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/nth-of-type.js
@@ -0,0 +1 @@
+module.exports = require('./common/nth');
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/slotted.js b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/slotted.js
new file mode 100644
index 0000000..9719f44
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/pseudo/slotted.js
@@ -0,0 +1,7 @@
+module.exports = {
+ parse: function compoundSelector() {
+ return this.createSingleNodeList(
+ this.Selector()
+ );
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js
new file mode 100644
index 0000000..a4bcab6
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/atrulePrelude.js
@@ -0,0 +1,3 @@
+module.exports = {
+ getNode: require('./default')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/scope/default.js b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/default.js
new file mode 100644
index 0000000..a1c6a31
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/default.js
@@ -0,0 +1,87 @@
+var cmpChar = require('../../tokenizer').cmpChar;
+var cmpStr = require('../../tokenizer').cmpStr;
+var TYPE = require('../../tokenizer').TYPE;
+
+var IDENT = TYPE.Ident;
+var STRING = TYPE.String;
+var NUMBER = TYPE.Number;
+var FUNCTION = TYPE.Function;
+var URL = TYPE.Url;
+var HASH = TYPE.Hash;
+var DIMENSION = TYPE.Dimension;
+var PERCENTAGE = TYPE.Percentage;
+var LEFTPARENTHESIS = TYPE.LeftParenthesis;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var COMMA = TYPE.Comma;
+var DELIM = TYPE.Delim;
+var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+var U = 0x0075; // U+0075 LATIN SMALL LETTER U (u)
+
+module.exports = function defaultRecognizer(context) {
+ switch (this.scanner.tokenType) {
+ case HASH:
+ return this.Hash();
+
+ case COMMA:
+ context.space = null;
+ context.ignoreWSAfter = true;
+ return this.Operator();
+
+ case LEFTPARENTHESIS:
+ return this.Parentheses(this.readSequence, context.recognizer);
+
+ case LEFTSQUAREBRACKET:
+ return this.Brackets(this.readSequence, context.recognizer);
+
+ case STRING:
+ return this.String();
+
+ case DIMENSION:
+ return this.Dimension();
+
+ case PERCENTAGE:
+ return this.Percentage();
+
+ case NUMBER:
+ return this.Number();
+
+ case FUNCTION:
+ return cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')
+ ? this.Url()
+ : this.Function(this.readSequence, context.recognizer);
+
+ case URL:
+ return this.Url();
+
+ case IDENT:
+ // check for unicode range, it should start with u+ or U+
+ if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) &&
+ cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) {
+ return this.UnicodeRange();
+ } else {
+ return this.Identifier();
+ }
+
+ case DELIM:
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ if (code === SOLIDUS ||
+ code === ASTERISK ||
+ code === PLUSSIGN ||
+ code === HYPHENMINUS) {
+ return this.Operator(); // TODO: replace with Delim
+ }
+
+ // TODO: produce a node with Delim node type
+
+ if (code === NUMBERSIGN) {
+ this.error('Hex or identifier is expected', this.scanner.tokenStart + 1);
+ }
+
+ break;
+ }
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/scope/index.js b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/index.js
new file mode 100644
index 0000000..d217ff8
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+ AtrulePrelude: require('./atrulePrelude'),
+ Selector: require('./selector'),
+ Value: require('./value')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/scope/selector.js b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/selector.js
new file mode 100644
index 0000000..7cb990b
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/selector.js
@@ -0,0 +1,80 @@
+var TYPE = require('../../tokenizer').TYPE;
+
+var DELIM = TYPE.Delim;
+var IDENT = TYPE.Ident;
+var DIMENSION = TYPE.Dimension;
+var PERCENTAGE = TYPE.Percentage;
+var NUMBER = TYPE.Number;
+var HASH = TYPE.Hash;
+var COLON = TYPE.Colon;
+var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
+var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#)
+var ASTERISK = 0x002A; // U+002A ASTERISK (*)
+var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
+var SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
+var FULLSTOP = 0x002E; // U+002E FULL STOP (.)
+var GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>)
+var VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
+var TILDE = 0x007E; // U+007E TILDE (~)
+
+function getNode(context) {
+ switch (this.scanner.tokenType) {
+ case LEFTSQUAREBRACKET:
+ return this.AttributeSelector();
+
+ case HASH:
+ return this.IdSelector();
+
+ case COLON:
+ if (this.scanner.lookupType(1) === COLON) {
+ return this.PseudoElementSelector();
+ } else {
+ return this.PseudoClassSelector();
+ }
+
+ case IDENT:
+ return this.TypeSelector();
+
+ case NUMBER:
+ case PERCENTAGE:
+ return this.Percentage();
+
+ case DIMENSION:
+ // throws when .123ident
+ if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === FULLSTOP) {
+ this.error('Identifier is expected', this.scanner.tokenStart + 1);
+ }
+ break;
+
+ case DELIM:
+ var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
+
+ switch (code) {
+ case PLUSSIGN:
+ case GREATERTHANSIGN:
+ case TILDE:
+ context.space = null;
+ context.ignoreWSAfter = true;
+ return this.Combinator();
+
+ case SOLIDUS: // /deep/
+ return this.Combinator();
+
+ case FULLSTOP:
+ return this.ClassSelector();
+
+ case ASTERISK:
+ case VERTICALLINE:
+ return this.TypeSelector();
+
+ case NUMBERSIGN:
+ return this.IdSelector();
+ }
+
+ break;
+ }
+};
+
+module.exports = {
+ getNode: getNode
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/syntax/scope/value.js b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/value.js
new file mode 100644
index 0000000..0403eb8
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/syntax/scope/value.js
@@ -0,0 +1,5 @@
+module.exports = {
+ getNode: require('./default'),
+ 'expression': require('../function/expression'),
+ 'var': require('../function/var')
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/tokenizer/char-code-definitions.js b/node_modules/csso/node_modules/css-tree/lib/tokenizer/char-code-definitions.js
new file mode 100644
index 0000000..fb9ec3f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/tokenizer/char-code-definitions.js
@@ -0,0 +1,249 @@
+var EOF = 0;
+
+// https://drafts.csswg.org/css-syntax-3/
+// § 4.2. Definitions
+
+// digit
+// A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9).
+function isDigit(code) {
+ return code >= 0x0030 && code <= 0x0039;
+}
+
+// hex digit
+// A digit, or a code point between U+0041 LATIN CAPITAL LETTER A (A) and U+0046 LATIN CAPITAL LETTER F (F),
+// or a code point between U+0061 LATIN SMALL LETTER A (a) and U+0066 LATIN SMALL LETTER F (f).
+function isHexDigit(code) {
+ return (
+ isDigit(code) || // 0 .. 9
+ (code >= 0x0041 && code <= 0x0046) || // A .. F
+ (code >= 0x0061 && code <= 0x0066) // a .. f
+ );
+}
+
+// uppercase letter
+// A code point between U+0041 LATIN CAPITAL LETTER A (A) and U+005A LATIN CAPITAL LETTER Z (Z).
+function isUppercaseLetter(code) {
+ return code >= 0x0041 && code <= 0x005A;
+}
+
+// lowercase letter
+// A code point between U+0061 LATIN SMALL LETTER A (a) and U+007A LATIN SMALL LETTER Z (z).
+function isLowercaseLetter(code) {
+ return code >= 0x0061 && code <= 0x007A;
+}
+
+// letter
+// An uppercase letter or a lowercase letter.
+function isLetter(code) {
+ return isUppercaseLetter(code) || isLowercaseLetter(code);
+}
+
+// non-ASCII code point
+// A code point with a value equal to or greater than U+0080 <control>.
+function isNonAscii(code) {
+ return code >= 0x0080;
+}
+
+// name-start code point
+// A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+function isNameStart(code) {
+ return isLetter(code) || isNonAscii(code) || code === 0x005F;
+}
+
+// name code point
+// A name-start code point, a digit, or U+002D HYPHEN-MINUS (-).
+function isName(code) {
+ return isNameStart(code) || isDigit(code) || code === 0x002D;
+}
+
+// non-printable code point
+// A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION,
+// or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE.
+function isNonPrintable(code) {
+ return (
+ (code >= 0x0000 && code <= 0x0008) ||
+ (code === 0x000B) ||
+ (code >= 0x000E && code <= 0x001F) ||
+ (code === 0x007F)
+ );
+}
+
+// newline
+// U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+// as they are converted to U+000A LINE FEED during preprocessing.
+// TODO: we doesn't do a preprocessing, so check a code point for U+000D CARRIAGE RETURN and U+000C FORM FEED
+function isNewline(code) {
+ return code === 0x000A || code === 0x000D || code === 0x000C;
+}
+
+// whitespace
+// A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
+function isWhiteSpace(code) {
+ return isNewline(code) || code === 0x0020 || code === 0x0009;
+}
+
+// § 4.3.8. Check if two code points are a valid escape
+function isValidEscape(first, second) {
+ // If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+ if (first !== 0x005C) {
+ return false;
+ }
+
+ // Otherwise, if the second code point is a newline or EOF, return false.
+ if (isNewline(second) || second === EOF) {
+ return false;
+ }
+
+ // Otherwise, return true.
+ return true;
+}
+
+// § 4.3.9. Check if three code points would start an identifier
+function isIdentifierStart(first, second, third) {
+ // Look at the first code point:
+
+ // U+002D HYPHEN-MINUS
+ if (first === 0x002D) {
+ // If the second code point is a name-start code point or a U+002D HYPHEN-MINUS,
+ // or the second and third code points are a valid escape, return true. Otherwise, return false.
+ return (
+ isNameStart(second) ||
+ second === 0x002D ||
+ isValidEscape(second, third)
+ );
+ }
+
+ // name-start code point
+ if (isNameStart(first)) {
+ // Return true.
+ return true;
+ }
+
+ // U+005C REVERSE SOLIDUS (\)
+ if (first === 0x005C) {
+ // If the first and second code points are a valid escape, return true. Otherwise, return false.
+ return isValidEscape(first, second);
+ }
+
+ // anything else
+ // Return false.
+ return false;
+}
+
+// § 4.3.10. Check if three code points would start a number
+function isNumberStart(first, second, third) {
+ // Look at the first code point:
+
+ // U+002B PLUS SIGN (+)
+ // U+002D HYPHEN-MINUS (-)
+ if (first === 0x002B || first === 0x002D) {
+ // If the second code point is a digit, return true.
+ if (isDigit(second)) {
+ return 2;
+ }
+
+ // Otherwise, if the second code point is a U+002E FULL STOP (.)
+ // and the third code point is a digit, return true.
+ // Otherwise, return false.
+ return second === 0x002E && isDigit(third) ? 3 : 0;
+ }
+
+ // U+002E FULL STOP (.)
+ if (first === 0x002E) {
+ // If the second code point is a digit, return true. Otherwise, return false.
+ return isDigit(second) ? 2 : 0;
+ }
+
+ // digit
+ if (isDigit(first)) {
+ // Return true.
+ return 1;
+ }
+
+ // anything else
+ // Return false.
+ return 0;
+}
+
+//
+// Misc
+//
+
+// detect BOM (https://en.wikipedia.org/wiki/Byte_order_mark)
+function isBOM(code) {
+ // UTF-16BE
+ if (code === 0xFEFF) {
+ return 1;
+ }
+
+ // UTF-16LE
+ if (code === 0xFFFE) {
+ return 1;
+ }
+
+ return 0;
+}
+
+// Fast code category
+//
+// https://drafts.csswg.org/css-syntax/#tokenizer-definitions
+// > non-ASCII code point
+// > A code point with a value equal to or greater than U+0080 <control>
+// > name-start code point
+// > A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+// > name code point
+// > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-)
+// That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only
+var CATEGORY = new Array(0x80);
+charCodeCategory.Eof = 0x80;
+charCodeCategory.WhiteSpace = 0x82;
+charCodeCategory.Digit = 0x83;
+charCodeCategory.NameStart = 0x84;
+charCodeCategory.NonPrintable = 0x85;
+
+for (var i = 0; i < CATEGORY.length; i++) {
+ switch (true) {
+ case isWhiteSpace(i):
+ CATEGORY[i] = charCodeCategory.WhiteSpace;
+ break;
+
+ case isDigit(i):
+ CATEGORY[i] = charCodeCategory.Digit;
+ break;
+
+ case isNameStart(i):
+ CATEGORY[i] = charCodeCategory.NameStart;
+ break;
+
+ case isNonPrintable(i):
+ CATEGORY[i] = charCodeCategory.NonPrintable;
+ break;
+
+ default:
+ CATEGORY[i] = i || charCodeCategory.Eof;
+ }
+}
+
+function charCodeCategory(code) {
+ return code < 0x80 ? CATEGORY[code] : charCodeCategory.NameStart;
+};
+
+module.exports = {
+ isDigit: isDigit,
+ isHexDigit: isHexDigit,
+ isUppercaseLetter: isUppercaseLetter,
+ isLowercaseLetter: isLowercaseLetter,
+ isLetter: isLetter,
+ isNonAscii: isNonAscii,
+ isNameStart: isNameStart,
+ isName: isName,
+ isNonPrintable: isNonPrintable,
+ isNewline: isNewline,
+ isWhiteSpace: isWhiteSpace,
+ isValidEscape: isValidEscape,
+ isIdentifierStart: isIdentifierStart,
+ isNumberStart: isNumberStart,
+
+ isBOM: isBOM,
+ charCodeCategory: charCodeCategory
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/tokenizer/const.js b/node_modules/csso/node_modules/css-tree/lib/tokenizer/const.js
new file mode 100644
index 0000000..e0f8869
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/tokenizer/const.js
@@ -0,0 +1,40 @@
+// CSS Syntax Module Level 3
+// https://www.w3.org/TR/css-syntax-3/
+var TYPE = {
+ EOF: 0, // <EOF-token>
+ Ident: 1, // <ident-token>
+ Function: 2, // <function-token>
+ AtKeyword: 3, // <at-keyword-token>
+ Hash: 4, // <hash-token>
+ String: 5, // <string-token>
+ BadString: 6, // <bad-string-token>
+ Url: 7, // <url-token>
+ BadUrl: 8, // <bad-url-token>
+ Delim: 9, // <delim-token>
+ Number: 10, // <number-token>
+ Percentage: 11, // <percentage-token>
+ Dimension: 12, // <dimension-token>
+ WhiteSpace: 13, // <whitespace-token>
+ CDO: 14, // <CDO-token>
+ CDC: 15, // <CDC-token>
+ Colon: 16, // <colon-token> :
+ Semicolon: 17, // <semicolon-token> ;
+ Comma: 18, // <comma-token> ,
+ LeftSquareBracket: 19, // <[-token>
+ RightSquareBracket: 20, // <]-token>
+ LeftParenthesis: 21, // <(-token>
+ RightParenthesis: 22, // <)-token>
+ LeftCurlyBracket: 23, // <{-token>
+ RightCurlyBracket: 24, // <}-token>
+ Comment: 25
+};
+
+var NAME = Object.keys(TYPE).reduce(function(result, key) {
+ result[TYPE[key]] = key;
+ return result;
+}, {});
+
+module.exports = {
+ TYPE: TYPE,
+ NAME: NAME
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/tokenizer/index.js b/node_modules/csso/node_modules/css-tree/lib/tokenizer/index.js
new file mode 100644
index 0000000..dd7ada2
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/tokenizer/index.js
@@ -0,0 +1,591 @@
+var TokenStream = require('../common/TokenStream');
+var adoptBuffer = require('../common/adopt-buffer');
+
+var constants = require('./const');
+var TYPE = constants.TYPE;
+
+var charCodeDefinitions = require('./char-code-definitions');
+var isNewline = charCodeDefinitions.isNewline;
+var isName = charCodeDefinitions.isName;
+var isValidEscape = charCodeDefinitions.isValidEscape;
+var isNumberStart = charCodeDefinitions.isNumberStart;
+var isIdentifierStart = charCodeDefinitions.isIdentifierStart;
+var charCodeCategory = charCodeDefinitions.charCodeCategory;
+var isBOM = charCodeDefinitions.isBOM;
+
+var utils = require('./utils');
+var cmpStr = utils.cmpStr;
+var getNewlineLength = utils.getNewlineLength;
+var findWhiteSpaceEnd = utils.findWhiteSpaceEnd;
+var consumeEscaped = utils.consumeEscaped;
+var consumeName = utils.consumeName;
+var consumeNumber = utils.consumeNumber;
+var consumeBadUrlRemnants = utils.consumeBadUrlRemnants;
+
+var OFFSET_MASK = 0x00FFFFFF;
+var TYPE_SHIFT = 24;
+
+function tokenize(source, stream) {
+ function getCharCode(offset) {
+ return offset < sourceLength ? source.charCodeAt(offset) : 0;
+ }
+
+ // § 4.3.3. Consume a numeric token
+ function consumeNumericToken() {
+ // Consume a number and let number be the result.
+ offset = consumeNumber(source, offset);
+
+ // If the next 3 input code points would start an identifier, then:
+ if (isIdentifierStart(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // Create a <dimension-token> with the same value and type flag as number, and a unit set initially to the empty string.
+ // Consume a name. Set the <dimension-token>’s unit to the returned value.
+ // Return the <dimension-token>.
+ type = TYPE.Dimension;
+ offset = consumeName(source, offset);
+ return;
+ }
+
+ // Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+ if (getCharCode(offset) === 0x0025) {
+ // Create a <percentage-token> with the same value as number, and return it.
+ type = TYPE.Percentage;
+ offset++;
+ return;
+ }
+
+ // Otherwise, create a <number-token> with the same value and type flag as number, and return it.
+ type = TYPE.Number;
+ }
+
+ // § 4.3.4. Consume an ident-like token
+ function consumeIdentLikeToken() {
+ const nameStartOffset = offset;
+
+ // Consume a name, and let string be the result.
+ offset = consumeName(source, offset);
+
+ // If string’s value is an ASCII case-insensitive match for "url",
+ // and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+ if (cmpStr(source, nameStartOffset, offset, 'url') && getCharCode(offset) === 0x0028) {
+ // While the next two input code points are whitespace, consume the next input code point.
+ offset = findWhiteSpaceEnd(source, offset + 1);
+
+ // If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('),
+ // or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('),
+ // then create a <function-token> with its value set to string and return it.
+ if (getCharCode(offset) === 0x0022 ||
+ getCharCode(offset) === 0x0027) {
+ type = TYPE.Function;
+ offset = nameStartOffset + 4;
+ return;
+ }
+
+ // Otherwise, consume a url token, and return it.
+ consumeUrlToken();
+ return;
+ }
+
+ // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+ // Create a <function-token> with its value set to string and return it.
+ if (getCharCode(offset) === 0x0028) {
+ type = TYPE.Function;
+ offset++;
+ return;
+ }
+
+ // Otherwise, create an <ident-token> with its value set to string and return it.
+ type = TYPE.Ident;
+ }
+
+ // § 4.3.5. Consume a string token
+ function consumeStringToken(endingCodePoint) {
+ // This algorithm may be called with an ending code point, which denotes the code point
+ // that ends the string. If an ending code point is not specified,
+ // the current input code point is used.
+ if (!endingCodePoint) {
+ endingCodePoint = getCharCode(offset++);
+ }
+
+ // Initially create a <string-token> with its value set to the empty string.
+ type = TYPE.String;
+
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ switch (charCodeCategory(code)) {
+ // ending code point
+ case endingCodePoint:
+ // Return the <string-token>.
+ offset++;
+ return;
+
+ // EOF
+ case charCodeCategory.Eof:
+ // This is a parse error. Return the <string-token>.
+ return;
+
+ // newline
+ case charCodeCategory.WhiteSpace:
+ if (isNewline(code)) {
+ // This is a parse error. Reconsume the current input code point,
+ // create a <bad-string-token>, and return it.
+ offset += getNewlineLength(source, offset, code);
+ type = TYPE.BadString;
+ return;
+ }
+ break;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the next input code point is EOF, do nothing.
+ if (offset === source.length - 1) {
+ break;
+ }
+
+ var nextCode = getCharCode(offset + 1);
+
+ // Otherwise, if the next input code point is a newline, consume it.
+ if (isNewline(nextCode)) {
+ offset += getNewlineLength(source, offset + 1, nextCode);
+ } else if (isValidEscape(code, nextCode)) {
+ // Otherwise, (the stream starts with a valid escape) consume
+ // an escaped code point and append the returned code point to
+ // the <string-token>’s value.
+ offset = consumeEscaped(source, offset) - 1;
+ }
+ break;
+
+ // anything else
+ // Append the current input code point to the <string-token>’s value.
+ }
+ }
+ }
+
+ // § 4.3.6. Consume a url token
+ // Note: This algorithm assumes that the initial "url(" has already been consumed.
+ // This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+ // A quoted value, like url("foo"), is parsed as a <function-token>. Consume an ident-like token
+ // automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+ function consumeUrlToken() {
+ // Initially create a <url-token> with its value set to the empty string.
+ type = TYPE.Url;
+
+ // Consume as much whitespace as possible.
+ offset = findWhiteSpaceEnd(source, offset);
+
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ switch (charCodeCategory(code)) {
+ // U+0029 RIGHT PARENTHESIS ())
+ case 0x0029:
+ // Return the <url-token>.
+ offset++;
+ return;
+
+ // EOF
+ case charCodeCategory.Eof:
+ // This is a parse error. Return the <url-token>.
+ return;
+
+ // whitespace
+ case charCodeCategory.WhiteSpace:
+ // Consume as much whitespace as possible.
+ offset = findWhiteSpaceEnd(source, offset);
+
+ // If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF,
+ // consume it and return the <url-token>
+ // (if EOF was encountered, this is a parse error);
+ if (getCharCode(offset) === 0x0029 || offset >= source.length) {
+ if (offset < source.length) {
+ offset++;
+ }
+ return;
+ }
+
+ // otherwise, consume the remnants of a bad url, create a <bad-url-token>,
+ // and return it.
+ offset = consumeBadUrlRemnants(source, offset);
+ type = TYPE.BadUrl;
+ return;
+
+ // U+0022 QUOTATION MARK (")
+ // U+0027 APOSTROPHE (')
+ // U+0028 LEFT PARENTHESIS (()
+ // non-printable code point
+ case 0x0022:
+ case 0x0027:
+ case 0x0028:
+ case charCodeCategory.NonPrintable:
+ // This is a parse error. Consume the remnants of a bad url,
+ // create a <bad-url-token>, and return it.
+ offset = consumeBadUrlRemnants(source, offset);
+ type = TYPE.BadUrl;
+ return;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the stream starts with a valid escape, consume an escaped code point and
+ // append the returned code point to the <url-token>’s value.
+ if (isValidEscape(code, getCharCode(offset + 1))) {
+ offset = consumeEscaped(source, offset) - 1;
+ break;
+ }
+
+ // Otherwise, this is a parse error. Consume the remnants of a bad url,
+ // create a <bad-url-token>, and return it.
+ offset = consumeBadUrlRemnants(source, offset);
+ type = TYPE.BadUrl;
+ return;
+
+ // anything else
+ // Append the current input code point to the <url-token>’s value.
+ }
+ }
+ }
+
+ if (!stream) {
+ stream = new TokenStream();
+ }
+
+ // ensure source is a string
+ source = String(source || '');
+
+ var sourceLength = source.length;
+ var offsetAndType = adoptBuffer(stream.offsetAndType, sourceLength + 1); // +1 because of eof-token
+ var balance = adoptBuffer(stream.balance, sourceLength + 1);
+ var tokenCount = 0;
+ var start = isBOM(getCharCode(0));
+ var offset = start;
+ var balanceCloseType = 0;
+ var balanceStart = 0;
+ var balancePrev = 0;
+
+ // https://drafts.csswg.org/css-syntax-3/#consume-token
+ // § 4.3.1. Consume a token
+ while (offset < sourceLength) {
+ var code = source.charCodeAt(offset);
+ var type = 0;
+
+ balance[tokenCount] = sourceLength;
+
+ switch (charCodeCategory(code)) {
+ // whitespace
+ case charCodeCategory.WhiteSpace:
+ // Consume as much whitespace as possible. Return a <whitespace-token>.
+ type = TYPE.WhiteSpace;
+ offset = findWhiteSpaceEnd(source, offset + 1);
+ break;
+
+ // U+0022 QUOTATION MARK (")
+ case 0x0022:
+ // Consume a string token and return it.
+ consumeStringToken();
+ break;
+
+ // U+0023 NUMBER SIGN (#)
+ case 0x0023:
+ // If the next input code point is a name code point or the next two input code points are a valid escape, then:
+ if (isName(getCharCode(offset + 1)) || isValidEscape(getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // Create a <hash-token>.
+ type = TYPE.Hash;
+
+ // If the next 3 input code points would start an identifier, set the <hash-token>’s type flag to "id".
+ // if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+ // // TODO: set id flag
+ // }
+
+ // Consume a name, and set the <hash-token>’s value to the returned string.
+ offset = consumeName(source, offset + 1);
+
+ // Return the <hash-token>.
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+0027 APOSTROPHE (')
+ case 0x0027:
+ // Consume a string token and return it.
+ consumeStringToken();
+ break;
+
+ // U+0028 LEFT PARENTHESIS (()
+ case 0x0028:
+ // Return a <(-token>.
+ type = TYPE.LeftParenthesis;
+ offset++;
+ break;
+
+ // U+0029 RIGHT PARENTHESIS ())
+ case 0x0029:
+ // Return a <)-token>.
+ type = TYPE.RightParenthesis;
+ offset++;
+ break;
+
+ // U+002B PLUS SIGN (+)
+ case 0x002B:
+ // If the input stream starts with a number, ...
+ if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+ break;
+
+ // U+002C COMMA (,)
+ case 0x002C:
+ // Return a <comma-token>.
+ type = TYPE.Comma;
+ offset++;
+ break;
+
+ // U+002D HYPHEN-MINUS (-)
+ case 0x002D:
+ // If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+ if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ consumeNumericToken();
+ } else {
+ // Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a <CDC-token>.
+ if (getCharCode(offset + 1) === 0x002D &&
+ getCharCode(offset + 2) === 0x003E) {
+ type = TYPE.CDC;
+ offset = offset + 3;
+ } else {
+ // Otherwise, if the input stream starts with an identifier, ...
+ if (isIdentifierStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+ }
+ }
+ break;
+
+ // U+002E FULL STOP (.)
+ case 0x002E:
+ // If the input stream starts with a number, ...
+ if (isNumberStart(code, getCharCode(offset + 1), getCharCode(offset + 2))) {
+ // ... reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+002F SOLIDUS (/)
+ case 0x002F:
+ // If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+ if (getCharCode(offset + 1) === 0x002A) {
+ // ... consume them and all following code points up to and including the first U+002A ASTERISK (*)
+ // followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+ type = TYPE.Comment;
+ offset = source.indexOf('*/', offset + 2) + 2;
+ if (offset === 1) {
+ offset = source.length;
+ }
+ } else {
+ type = TYPE.Delim;
+ offset++;
+ }
+ break;
+
+ // U+003A COLON (:)
+ case 0x003A:
+ // Return a <colon-token>.
+ type = TYPE.Colon;
+ offset++;
+ break;
+
+ // U+003B SEMICOLON (;)
+ case 0x003B:
+ // Return a <semicolon-token>.
+ type = TYPE.Semicolon;
+ offset++;
+ break;
+
+ // U+003C LESS-THAN SIGN (<)
+ case 0x003C:
+ // If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), ...
+ if (getCharCode(offset + 1) === 0x0021 &&
+ getCharCode(offset + 2) === 0x002D &&
+ getCharCode(offset + 3) === 0x002D) {
+ // ... consume them and return a <CDO-token>.
+ type = TYPE.CDO;
+ offset = offset + 4;
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+0040 COMMERCIAL AT (@)
+ case 0x0040:
+ // If the next 3 input code points would start an identifier, ...
+ if (isIdentifierStart(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) {
+ // ... consume a name, create an <at-keyword-token> with its value set to the returned value, and return it.
+ type = TYPE.AtKeyword;
+ offset = consumeName(source, offset + 1);
+ } else {
+ // Otherwise, return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+
+ break;
+
+ // U+005B LEFT SQUARE BRACKET ([)
+ case 0x005B:
+ // Return a <[-token>.
+ type = TYPE.LeftSquareBracket;
+ offset++;
+ break;
+
+ // U+005C REVERSE SOLIDUS (\)
+ case 0x005C:
+ // If the input stream starts with a valid escape, ...
+ if (isValidEscape(code, getCharCode(offset + 1))) {
+ // ... reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ } else {
+ // Otherwise, this is a parse error. Return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+ break;
+
+ // U+005D RIGHT SQUARE BRACKET (])
+ case 0x005D:
+ // Return a <]-token>.
+ type = TYPE.RightSquareBracket;
+ offset++;
+ break;
+
+ // U+007B LEFT CURLY BRACKET ({)
+ case 0x007B:
+ // Return a <{-token>.
+ type = TYPE.LeftCurlyBracket;
+ offset++;
+ break;
+
+ // U+007D RIGHT CURLY BRACKET (})
+ case 0x007D:
+ // Return a <}-token>.
+ type = TYPE.RightCurlyBracket;
+ offset++;
+ break;
+
+ // digit
+ case charCodeCategory.Digit:
+ // Reconsume the current input code point, consume a numeric token, and return it.
+ consumeNumericToken();
+ break;
+
+ // name-start code point
+ case charCodeCategory.NameStart:
+ // Reconsume the current input code point, consume an ident-like token, and return it.
+ consumeIdentLikeToken();
+ break;
+
+ // EOF
+ case charCodeCategory.Eof:
+ // Return an <EOF-token>.
+ break;
+
+ // anything else
+ default:
+ // Return a <delim-token> with its value set to the current input code point.
+ type = TYPE.Delim;
+ offset++;
+ }
+
+ switch (type) {
+ case balanceCloseType:
+ balancePrev = balanceStart & OFFSET_MASK;
+ balanceStart = balance[balancePrev];
+ balanceCloseType = balanceStart >> TYPE_SHIFT;
+ balance[tokenCount] = balancePrev;
+ balance[balancePrev++] = tokenCount;
+ for (; balancePrev < tokenCount; balancePrev++) {
+ if (balance[balancePrev] === sourceLength) {
+ balance[balancePrev] = tokenCount;
+ }
+ }
+ break;
+
+ case TYPE.LeftParenthesis:
+ case TYPE.Function:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE.RightParenthesis;
+ balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+ break;
+
+ case TYPE.LeftSquareBracket:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE.RightSquareBracket;
+ balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+ break;
+
+ case TYPE.LeftCurlyBracket:
+ balance[tokenCount] = balanceStart;
+ balanceCloseType = TYPE.RightCurlyBracket;
+ balanceStart = (balanceCloseType << TYPE_SHIFT) | tokenCount;
+ break;
+ }
+
+ offsetAndType[tokenCount++] = (type << TYPE_SHIFT) | offset;
+ }
+
+ // finalize buffers
+ offsetAndType[tokenCount] = (TYPE.EOF << TYPE_SHIFT) | offset; // <EOF-token>
+ balance[tokenCount] = sourceLength;
+ balance[sourceLength] = sourceLength; // prevents false positive balance match with any token
+ while (balanceStart !== 0) {
+ balancePrev = balanceStart & OFFSET_MASK;
+ balanceStart = balance[balancePrev];
+ balance[balancePrev] = sourceLength;
+ }
+
+ // update stream
+ stream.source = source;
+ stream.firstCharOffset = start;
+ stream.offsetAndType = offsetAndType;
+ stream.tokenCount = tokenCount;
+ stream.balance = balance;
+ stream.reset();
+ stream.next();
+
+ return stream;
+}
+
+// extend tokenizer with constants
+Object.keys(constants).forEach(function(key) {
+ tokenize[key] = constants[key];
+});
+
+// extend tokenizer with static methods from utils
+Object.keys(charCodeDefinitions).forEach(function(key) {
+ tokenize[key] = charCodeDefinitions[key];
+});
+Object.keys(utils).forEach(function(key) {
+ tokenize[key] = utils[key];
+});
+
+module.exports = tokenize;
diff --git a/node_modules/csso/node_modules/css-tree/lib/tokenizer/utils.js b/node_modules/csso/node_modules/css-tree/lib/tokenizer/utils.js
new file mode 100644
index 0000000..f5a38ec
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/tokenizer/utils.js
@@ -0,0 +1,243 @@
+var charCodeDef = require('./char-code-definitions');
+var isDigit = charCodeDef.isDigit;
+var isHexDigit = charCodeDef.isHexDigit;
+var isUppercaseLetter = charCodeDef.isUppercaseLetter;
+var isName = charCodeDef.isName;
+var isWhiteSpace = charCodeDef.isWhiteSpace;
+var isValidEscape = charCodeDef.isValidEscape;
+
+function getCharCode(source, offset) {
+ return offset < source.length ? source.charCodeAt(offset) : 0;
+}
+
+function getNewlineLength(source, offset, code) {
+ if (code === 13 /* \r */ && getCharCode(source, offset + 1) === 10 /* \n */) {
+ return 2;
+ }
+
+ return 1;
+}
+
+function cmpChar(testStr, offset, referenceCode) {
+ var code = testStr.charCodeAt(offset);
+
+ // code.toLowerCase() for A..Z
+ if (isUppercaseLetter(code)) {
+ code = code | 32;
+ }
+
+ return code === referenceCode;
+}
+
+function cmpStr(testStr, start, end, referenceStr) {
+ if (end - start !== referenceStr.length) {
+ return false;
+ }
+
+ if (start < 0 || end > testStr.length) {
+ return false;
+ }
+
+ for (var i = start; i < end; i++) {
+ var testCode = testStr.charCodeAt(i);
+ var referenceCode = referenceStr.charCodeAt(i - start);
+
+ // testCode.toLowerCase() for A..Z
+ if (isUppercaseLetter(testCode)) {
+ testCode = testCode | 32;
+ }
+
+ if (testCode !== referenceCode) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function findWhiteSpaceStart(source, offset) {
+ for (; offset >= 0; offset--) {
+ if (!isWhiteSpace(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset + 1;
+}
+
+function findWhiteSpaceEnd(source, offset) {
+ for (; offset < source.length; offset++) {
+ if (!isWhiteSpace(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset;
+}
+
+function findDecimalNumberEnd(source, offset) {
+ for (; offset < source.length; offset++) {
+ if (!isDigit(source.charCodeAt(offset))) {
+ break;
+ }
+ }
+
+ return offset;
+}
+
+// § 4.3.7. Consume an escaped code point
+function consumeEscaped(source, offset) {
+ // It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and
+ // that the next input code point has already been verified to be part of a valid escape.
+ offset += 2;
+
+ // hex digit
+ if (isHexDigit(getCharCode(source, offset - 1))) {
+ // Consume as many hex digits as possible, but no more than 5.
+ // Note that this means 1-6 hex digits have been consumed in total.
+ for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) {
+ if (!isHexDigit(getCharCode(source, offset))) {
+ break;
+ }
+ }
+
+ // If the next input code point is whitespace, consume it as well.
+ var code = getCharCode(source, offset);
+ if (isWhiteSpace(code)) {
+ offset += getNewlineLength(source, offset, code);
+ }
+ }
+
+ return offset;
+}
+
+// §4.3.11. Consume a name
+// Note: This algorithm does not do the verification of the first few code points that are necessary
+// to ensure the returned code points would constitute an <ident-token>. If that is the intended use,
+// ensure that the stream starts with an identifier before calling this algorithm.
+function consumeName(source, offset) {
+ // Let result initially be an empty string.
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ // name code point
+ if (isName(code)) {
+ // Append the code point to result.
+ continue;
+ }
+
+ // the stream starts with a valid escape
+ if (isValidEscape(code, getCharCode(source, offset + 1))) {
+ // Consume an escaped code point. Append the returned code point to result.
+ offset = consumeEscaped(source, offset) - 1;
+ continue;
+ }
+
+ // anything else
+ // Reconsume the current input code point. Return result.
+ break;
+ }
+
+ return offset;
+}
+
+// §4.3.12. Consume a number
+function consumeNumber(source, offset) {
+ var code = source.charCodeAt(offset);
+
+ // 2. If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-),
+ // consume it and append it to repr.
+ if (code === 0x002B || code === 0x002D) {
+ code = source.charCodeAt(offset += 1);
+ }
+
+ // 3. While the next input code point is a digit, consume it and append it to repr.
+ if (isDigit(code)) {
+ offset = findDecimalNumberEnd(source, offset + 1);
+ code = source.charCodeAt(offset);
+ }
+
+ // 4. If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+ if (code === 0x002E && isDigit(source.charCodeAt(offset + 1))) {
+ // 4.1 Consume them.
+ // 4.2 Append them to repr.
+ code = source.charCodeAt(offset += 2);
+
+ // 4.3 Set type to "number".
+ // TODO
+
+ // 4.4 While the next input code point is a digit, consume it and append it to repr.
+
+ offset = findDecimalNumberEnd(source, offset);
+ }
+
+ // 5. If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E)
+ // or U+0065 LATIN SMALL LETTER E (e), ... , followed by a digit, then:
+ if (cmpChar(source, offset, 101 /* e */)) {
+ var sign = 0;
+ code = source.charCodeAt(offset + 1);
+
+ // ... optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+) ...
+ if (code === 0x002D || code === 0x002B) {
+ sign = 1;
+ code = source.charCodeAt(offset + 2);
+ }
+
+ // ... followed by a digit
+ if (isDigit(code)) {
+ // 5.1 Consume them.
+ // 5.2 Append them to repr.
+
+ // 5.3 Set type to "number".
+ // TODO
+
+ // 5.4 While the next input code point is a digit, consume it and append it to repr.
+ offset = findDecimalNumberEnd(source, offset + 1 + sign + 1);
+ }
+ }
+
+ return offset;
+}
+
+// § 4.3.14. Consume the remnants of a bad url
+// ... its sole use is to consume enough of the input stream to reach a recovery point
+// where normal tokenizing can resume.
+function consumeBadUrlRemnants(source, offset) {
+ // Repeatedly consume the next input code point from the stream:
+ for (; offset < source.length; offset++) {
+ var code = source.charCodeAt(offset);
+
+ // U+0029 RIGHT PARENTHESIS ())
+ // EOF
+ if (code === 0x0029) {
+ // Return.
+ offset++;
+ break;
+ }
+
+ if (isValidEscape(code, getCharCode(source, offset + 1))) {
+ // Consume an escaped code point.
+ // Note: This allows an escaped right parenthesis ("\)") to be encountered
+ // without ending the <bad-url-token>. This is otherwise identical to
+ // the "anything else" clause.
+ offset = consumeEscaped(source, offset);
+ }
+ }
+
+ return offset;
+}
+
+module.exports = {
+ consumeEscaped: consumeEscaped,
+ consumeName: consumeName,
+ consumeNumber: consumeNumber,
+ consumeBadUrlRemnants: consumeBadUrlRemnants,
+
+ cmpChar: cmpChar,
+ cmpStr: cmpStr,
+
+ getNewlineLength: getNewlineLength,
+ findWhiteSpaceStart: findWhiteSpaceStart,
+ findWhiteSpaceEnd: findWhiteSpaceEnd
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/utils/clone.js b/node_modules/csso/node_modules/css-tree/lib/utils/clone.js
new file mode 100644
index 0000000..927294b
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/utils/clone.js
@@ -0,0 +1,21 @@
+var List = require('../common/List');
+
+module.exports = function clone(node) {
+ var result = {};
+
+ for (var key in node) {
+ var value = node[key];
+
+ if (value) {
+ if (Array.isArray(value) || value instanceof List) {
+ value = value.map(clone);
+ } else if (value.constructor === Object) {
+ value = clone(value);
+ }
+ }
+
+ result[key] = value;
+ }
+
+ return result;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/utils/createCustomError.js b/node_modules/csso/node_modules/css-tree/lib/utils/createCustomError.js
new file mode 100644
index 0000000..59285d8
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/utils/createCustomError.js
@@ -0,0 +1,17 @@
+module.exports = function createCustomError(name, message) {
+ // use Object.create(), because some VMs prevent setting line/column otherwise
+ // (iOS Safari 10 even throws an exception)
+ var error = Object.create(SyntaxError.prototype);
+ var errorStack = new Error();
+
+ error.name = name;
+ error.message = message;
+
+ Object.defineProperty(error, 'stack', {
+ get: function() {
+ return (errorStack.stack || '').replace(/^(.+\n){1,3}/, name + ': ' + message + '\n');
+ }
+ });
+
+ return error;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/utils/names.js b/node_modules/csso/node_modules/css-tree/lib/utils/names.js
new file mode 100644
index 0000000..fdc3f1f
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/utils/names.js
@@ -0,0 +1,104 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var keywords = Object.create(null);
+var properties = Object.create(null);
+var HYPHENMINUS = 45; // '-'.charCodeAt()
+
+function isCustomProperty(str, offset) {
+ offset = offset || 0;
+
+ return str.length - offset >= 2 &&
+ str.charCodeAt(offset) === HYPHENMINUS &&
+ str.charCodeAt(offset + 1) === HYPHENMINUS;
+}
+
+function getVendorPrefix(str, offset) {
+ offset = offset || 0;
+
+ // verdor prefix should be at least 3 chars length
+ if (str.length - offset >= 3) {
+ // vendor prefix starts with hyper minus following non-hyper minus
+ if (str.charCodeAt(offset) === HYPHENMINUS &&
+ str.charCodeAt(offset + 1) !== HYPHENMINUS) {
+ // vendor prefix should contain a hyper minus at the ending
+ var secondDashIndex = str.indexOf('-', offset + 2);
+
+ if (secondDashIndex !== -1) {
+ return str.substring(offset, secondDashIndex + 1);
+ }
+ }
+ }
+
+ return '';
+}
+
+function getKeywordDescriptor(keyword) {
+ if (hasOwnProperty.call(keywords, keyword)) {
+ return keywords[keyword];
+ }
+
+ var name = keyword.toLowerCase();
+
+ if (hasOwnProperty.call(keywords, name)) {
+ return keywords[keyword] = keywords[name];
+ }
+
+ var custom = isCustomProperty(name, 0);
+ var vendor = !custom ? getVendorPrefix(name, 0) : '';
+
+ return keywords[keyword] = Object.freeze({
+ basename: name.substr(vendor.length),
+ name: name,
+ vendor: vendor,
+ prefix: vendor,
+ custom: custom
+ });
+}
+
+function getPropertyDescriptor(property) {
+ if (hasOwnProperty.call(properties, property)) {
+ return properties[property];
+ }
+
+ var name = property;
+ var hack = property[0];
+
+ if (hack === '/') {
+ hack = property[1] === '/' ? '//' : '/';
+ } else if (hack !== '_' &&
+ hack !== '*' &&
+ hack !== '$' &&
+ hack !== '#' &&
+ hack !== '+' &&
+ hack !== '&') {
+ hack = '';
+ }
+
+ var custom = isCustomProperty(name, hack.length);
+
+ // re-use result when possible (the same as for lower case)
+ if (!custom) {
+ name = name.toLowerCase();
+ if (hasOwnProperty.call(properties, name)) {
+ return properties[property] = properties[name];
+ }
+ }
+
+ var vendor = !custom ? getVendorPrefix(name, hack.length) : '';
+ var prefix = name.substr(0, hack.length + vendor.length);
+
+ return properties[property] = Object.freeze({
+ basename: name.substr(prefix.length),
+ name: name.substr(hack.length),
+ hack: hack,
+ vendor: vendor,
+ prefix: prefix,
+ custom: custom
+ });
+}
+
+module.exports = {
+ keyword: getKeywordDescriptor,
+ property: getPropertyDescriptor,
+ isCustomProperty: isCustomProperty,
+ vendorPrefix: getVendorPrefix
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/walker/create.js b/node_modules/csso/node_modules/css-tree/lib/walker/create.js
new file mode 100644
index 0000000..1731465
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/walker/create.js
@@ -0,0 +1,284 @@
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var noop = function() {};
+
+function ensureFunction(value) {
+ return typeof value === 'function' ? value : noop;
+}
+
+function invokeForType(fn, type) {
+ return function(node, item, list) {
+ if (node.type === type) {
+ fn.call(this, node, item, list);
+ }
+ };
+}
+
+function getWalkersFromStructure(name, nodeType) {
+ var structure = nodeType.structure;
+ var walkers = [];
+
+ for (var key in structure) {
+ if (hasOwnProperty.call(structure, key) === false) {
+ continue;
+ }
+
+ var fieldTypes = structure[key];
+ var walker = {
+ name: key,
+ type: false,
+ nullable: false
+ };
+
+ if (!Array.isArray(structure[key])) {
+ fieldTypes = [structure[key]];
+ }
+
+ for (var i = 0; i < fieldTypes.length; i++) {
+ var fieldType = fieldTypes[i];
+ if (fieldType === null) {
+ walker.nullable = true;
+ } else if (typeof fieldType === 'string') {
+ walker.type = 'node';
+ } else if (Array.isArray(fieldType)) {
+ walker.type = 'list';
+ }
+ }
+
+ if (walker.type) {
+ walkers.push(walker);
+ }
+ }
+
+ if (walkers.length) {
+ return {
+ context: nodeType.walkContext,
+ fields: walkers
+ };
+ }
+
+ return null;
+}
+
+function getTypesFromConfig(config) {
+ var types = {};
+
+ for (var name in config.node) {
+ if (hasOwnProperty.call(config.node, name)) {
+ var nodeType = config.node[name];
+
+ if (!nodeType.structure) {
+ throw new Error('Missed `structure` field in `' + name + '` node type definition');
+ }
+
+ types[name] = getWalkersFromStructure(name, nodeType);
+ }
+ }
+
+ return types;
+}
+
+function createTypeIterator(config, reverse) {
+ var fields = config.fields.slice();
+ var contextName = config.context;
+ var useContext = typeof contextName === 'string';
+
+ if (reverse) {
+ fields.reverse();
+ }
+
+ return function(node, context, walk, walkReducer) {
+ var prevContextValue;
+
+ if (useContext) {
+ prevContextValue = context[contextName];
+ context[contextName] = node;
+ }
+
+ for (var i = 0; i < fields.length; i++) {
+ var field = fields[i];
+ var ref = node[field.name];
+
+ if (!field.nullable || ref) {
+ if (field.type === 'list') {
+ var breakWalk = reverse
+ ? ref.reduceRight(walkReducer, false)
+ : ref.reduce(walkReducer, false);
+
+ if (breakWalk) {
+ return true;
+ }
+ } else if (walk(ref)) {
+ return true;
+ }
+ }
+ }
+
+ if (useContext) {
+ context[contextName] = prevContextValue;
+ }
+ };
+}
+
+function createFastTraveralMap(iterators) {
+ return {
+ Atrule: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block
+ },
+ Rule: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block
+ },
+ Declaration: {
+ StyleSheet: iterators.StyleSheet,
+ Atrule: iterators.Atrule,
+ Rule: iterators.Rule,
+ Block: iterators.Block,
+ DeclarationList: iterators.DeclarationList
+ }
+ };
+}
+
+module.exports = function createWalker(config) {
+ var types = getTypesFromConfig(config);
+ var iteratorsNatural = {};
+ var iteratorsReverse = {};
+ var breakWalk = Symbol('break-walk');
+ var skipNode = Symbol('skip-node');
+
+ for (var name in types) {
+ if (hasOwnProperty.call(types, name) && types[name] !== null) {
+ iteratorsNatural[name] = createTypeIterator(types[name], false);
+ iteratorsReverse[name] = createTypeIterator(types[name], true);
+ }
+ }
+
+ var fastTraversalIteratorsNatural = createFastTraveralMap(iteratorsNatural);
+ var fastTraversalIteratorsReverse = createFastTraveralMap(iteratorsReverse);
+
+ var walk = function(root, options) {
+ function walkNode(node, item, list) {
+ var enterRet = enter.call(context, node, item, list);
+
+ if (enterRet === breakWalk) {
+ debugger;
+ return true;
+ }
+
+ if (enterRet === skipNode) {
+ return false;
+ }
+
+ if (iterators.hasOwnProperty(node.type)) {
+ if (iterators[node.type](node, context, walkNode, walkReducer)) {
+ return true;
+ }
+ }
+
+ if (leave.call(context, node, item, list) === breakWalk) {
+ return true;
+ }
+
+ return false;
+ }
+
+ var walkReducer = (ret, data, item, list) => ret || walkNode(data, item, list);
+ var enter = noop;
+ var leave = noop;
+ var iterators = iteratorsNatural;
+ var context = {
+ break: breakWalk,
+ skip: skipNode,
+
+ root: root,
+ stylesheet: null,
+ atrule: null,
+ atrulePrelude: null,
+ rule: null,
+ selector: null,
+ block: null,
+ declaration: null,
+ function: null
+ };
+
+ if (typeof options === 'function') {
+ enter = options;
+ } else if (options) {
+ enter = ensureFunction(options.enter);
+ leave = ensureFunction(options.leave);
+
+ if (options.reverse) {
+ iterators = iteratorsReverse;
+ }
+
+ if (options.visit) {
+ if (fastTraversalIteratorsNatural.hasOwnProperty(options.visit)) {
+ iterators = options.reverse
+ ? fastTraversalIteratorsReverse[options.visit]
+ : fastTraversalIteratorsNatural[options.visit];
+ } else if (!types.hasOwnProperty(options.visit)) {
+ throw new Error('Bad value `' + options.visit + '` for `visit` option (should be: ' + Object.keys(types).join(', ') + ')');
+ }
+
+ enter = invokeForType(enter, options.visit);
+ leave = invokeForType(leave, options.visit);
+ }
+ }
+
+ if (enter === noop && leave === noop) {
+ throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function');
+ }
+
+ walkNode(root);
+ };
+
+ walk.break = breakWalk;
+ walk.skip = skipNode;
+
+ walk.find = function(ast, fn) {
+ var found = null;
+
+ walk(ast, function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found = node;
+ return breakWalk;
+ }
+ });
+
+ return found;
+ };
+
+ walk.findLast = function(ast, fn) {
+ var found = null;
+
+ walk(ast, {
+ reverse: true,
+ enter: function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found = node;
+ return breakWalk;
+ }
+ }
+ });
+
+ return found;
+ };
+
+ walk.findAll = function(ast, fn) {
+ var found = [];
+
+ walk(ast, function(node, item, list) {
+ if (fn.call(this, node, item, list)) {
+ found.push(node);
+ }
+ });
+
+ return found;
+ };
+
+ return walk;
+};
diff --git a/node_modules/csso/node_modules/css-tree/lib/walker/index.js b/node_modules/csso/node_modules/css-tree/lib/walker/index.js
new file mode 100644
index 0000000..f3f0d6d
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/lib/walker/index.js
@@ -0,0 +1,4 @@
+var createWalker = require('./create');
+var config = require('../syntax/config/walker');
+
+module.exports = createWalker(config);
diff --git a/node_modules/csso/node_modules/css-tree/package.json b/node_modules/csso/node_modules/css-tree/package.json
new file mode 100644
index 0000000..4bf9015
--- /dev/null
+++ b/node_modules/csso/node_modules/css-tree/package.json
@@ -0,0 +1,96 @@
+{
+ "_from": "css-tree@^1.1.2",
+ "_id": "css-tree@1.1.2",
+ "_inBundle": false,
+ "_integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
+ "_location": "/csso/css-tree",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "css-tree@^1.1.2",
+ "name": "css-tree",
+ "escapedName": "css-tree",
+ "rawSpec": "^1.1.2",
+ "saveSpec": null,
+ "fetchSpec": "^1.1.2"
+ },
+ "_requiredBy": [
+ "/csso"
+ ],
+ "_resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
+ "_shasum": "9ae393b5dafd7dae8a622475caec78d3d8fbd7b5",
+ "_spec": "css-tree@^1.1.2",
+ "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\csso",
+ "author": {
+ "name": "Roman Dvornov",
+ "email": "rdvornov@gmail.com",
+ "url": "https://github.com/lahmatiy"
+ },
+ "bugs": {
+ "url": "https://github.com/csstree/csstree/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "deprecated": false,
+ "description": "A tool set for CSS: fast detailed parser (CSS → AST), walker (AST traversal), generator (AST → CSS) and lexer (validation and matching) based on specs and browser implementations",
+ "devDependencies": {
+ "@rollup/plugin-commonjs": "^11.0.2",
+ "@rollup/plugin-json": "^4.0.2",
+ "@rollup/plugin-node-resolve": "^7.1.1",
+ "coveralls": "^3.0.9",
+ "eslint": "^6.8.0",
+ "json-to-ast": "^2.1.0",
+ "mocha": "^6.2.3",
+ "nyc": "^14.1.1",
+ "rollup": "^1.32.1",
+ "rollup-plugin-terser": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "files": [
+ "data",
+ "dist",
+ "lib"
+ ],
+ "homepage": "https://github.com/csstree/csstree#readme",
+ "jsdelivr": "dist/csstree.min.js",
+ "keywords": [
+ "css",
+ "ast",
+ "tokenizer",
+ "parser",
+ "walker",
+ "lexer",
+ "generator",
+ "utils",
+ "syntax",
+ "validation"
+ ],
+ "license": "MIT",
+ "main": "lib/index.js",
+ "name": "css-tree",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/csstree/csstree.git"
+ },
+ "scripts": {
+ "build": "rollup --config",
+ "coverage": "nyc npm test",
+ "coveralls": "nyc report --reporter=text-lcov | coveralls",
+ "hydrogen": "node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/parse --stat -o /dev/null",
+ "lint": "eslint data lib scripts test && node scripts/review-syntax-patch --lint && node scripts/update-docs --lint",
+ "lint-and-test": "npm run lint && npm test",
+ "prepublishOnly": "npm run build",
+ "review:syntax-patch": "node scripts/review-syntax-patch",
+ "test": "mocha --reporter progress",
+ "travis": "nyc npm run lint-and-test && npm run coveralls",
+ "update:docs": "node scripts/update-docs"
+ },
+ "unpkg": "dist/csstree.min.js",
+ "version": "1.1.2"
+}
diff --git a/node_modules/csso/node_modules/mdn-data/LICENSE b/node_modules/csso/node_modules/mdn-data/LICENSE
new file mode 100644
index 0000000..670154e
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/LICENSE
@@ -0,0 +1,116 @@
+CC0 1.0 Universal
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator and
+subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later
+claims of infringement build upon, modify, incorporate in other works, reuse
+and redistribute as freely as possible in any form whatsoever and for any
+purposes, including without limitation commercial purposes. These owners may
+contribute to the Commons to promote the ideal of a free culture and the
+further production of creative, cultural and scientific works, or to gain
+reputation or greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with a
+Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or her
+Copyright and Related Rights in the Work and the meaning and intended legal
+effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not limited
+to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display, communicate,
+ and translate a Work;
+
+ ii. moral rights retained by the original author(s) and/or performer(s);
+
+ iii. publicity and privacy rights pertaining to a person's image or likeness
+ depicted in a Work;
+
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+
+ v. rights protecting the extraction, dissemination, use and reuse of data in
+ a Work;
+
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation thereof,
+ including any amended or successor version of such directive); and
+
+ vii. other similar, equivalent or corresponding rights throughout the world
+ based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number of
+copies, and (iv) for any purpose whatsoever, including without limitation
+commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
+the Waiver for the benefit of each member of the public at large and to the
+detriment of Affirmer's heirs and successors, fully intending that such Waiver
+shall not be subject to revocation, rescission, cancellation, termination, or
+any other legal or equitable action to disrupt the quiet enjoyment of the Work
+by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account
+Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
+is so judged Affirmer hereby grants to each affected person a royalty-free,
+non transferable, non sublicensable, non exclusive, irrevocable and
+unconditional license to exercise Affirmer's Copyright and Related Rights in
+the Work (i) in all territories worldwide, (ii) for the maximum duration
+provided by applicable law or treaty (including future time extensions), (iii)
+in any current or future medium and for any number of copies, and (iv) for any
+purpose whatsoever, including without limitation commercial, advertising or
+promotional purposes (the "License"). The License shall be deemed effective as
+of the date CC0 was applied by Affirmer to the Work. Should any part of the
+License for any reason be judged legally invalid or ineffective under
+applicable law, such partial invalidity or ineffectiveness shall not
+invalidate the remainder of the License, and in such case Affirmer hereby
+affirms that he or she will not (i) exercise any of his or her remaining
+Copyright and Related Rights in the Work or (ii) assert any associated claims
+and causes of action with respect to the Work, in either case contrary to
+Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+
+ b. Affirmer offers the Work as-is and makes no representations or warranties
+ of any kind concerning the Work, express, implied, statutory or otherwise,
+ including without limitation warranties of title, merchantability, fitness
+ for a particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors, whether or not
+ discoverable, all to the greatest extent permissible under applicable law.
+
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without limitation
+ any person's Copyright and Related Rights in the Work. Further, Affirmer
+ disclaims responsibility for obtaining any necessary consents, permissions
+ or other rights required for any use of the Work.
+
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to this
+ CC0 or use of the Work.
+
+For more information, please see
+<http://creativecommons.org/publicdomain/zero/1.0/>
diff --git a/node_modules/csso/node_modules/mdn-data/README.md b/node_modules/csso/node_modules/mdn-data/README.md
new file mode 100644
index 0000000..3a5a1e9
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/README.md
@@ -0,0 +1,56 @@
+# MDN data
+
+[https://github.com/mdn/data](https://github.com/mdn/data)
+
+Maintained by the [MDN team at Mozilla](https://wiki.mozilla.org/MDN).
+
+This repository contains general data for Web technologies.
+
+This data is used in MDN documentation, to build
+[information boxes](https://developer.mozilla.org/en-US/docs/Web/CSS/background)
+or [sidebar navigation](https://developer.mozilla.org/en-US/docs/Web/API/Window).
+External tools have started to make use of this data as well.
+For example, the [CSSTree](https://github.com/csstree/csstree/) CSS parser.
+
+
+[](https://www.npmjs.com/package/mdn-data)
+[](https://travis-ci.org/mdn/data)
+
+## Repository contents
+
+There's a top-level directory for each broad area covered: for example, "api",
+"css", "svg". Inside each of these directories is one or more
+JSON files containing the data.
+
+### api
+Contains data about Web APIs:
+* API inheritance (interface inheritance and mixin implementations)
+
+### css
+ Contains data about:
+* CSS at-rules
+* CSS properties
+* CSS selectors
+* CSS syntaxes
+* CSS types
+* CSS units
+
+Read more about [CSS data](https://github.com/mdn/data/blob/master/css/readme.md) and the format of the files.
+
+
+### l10n
+The l10n folder contains localization strings that are used in the various
+json files throughout this repository.
+
+## Problems?
+
+If you find a problem, please [file an issue](https://github.com/mdn/data/issues/new).
+
+## Contributing
+
+We're very happy to accept contributions to this data. Please familiarize yourself
+with the schema for the data you're editing, and send us a pull request. See also the [Contributing file](https://github.com/mdn/data/blob/master/CONTRIBUTING.md) for more information.
+
+## See also
+* [https://github.com/mdn/browser-compat-data](https://github.com/mdn/browser-compat-data)
+for compatibility data for Web technologies.
diff --git a/node_modules/csso/node_modules/mdn-data/api/index.js b/node_modules/csso/node_modules/mdn-data/api/index.js
new file mode 100644
index 0000000..4c1ec9b
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/api/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+ inheritance: require('./inheritance'),
+}
diff --git a/node_modules/csso/node_modules/mdn-data/api/inheritance.json b/node_modules/csso/node_modules/mdn-data/api/inheritance.json
new file mode 100644
index 0000000..c209790
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/api/inheritance.json
@@ -0,0 +1,2681 @@
+{
+ "AbsoluteOrientationSensor": {
+ "inherits": "OrientationSensor",
+ "implements": []
+ },
+ "AbstractRange": {
+ "inherits": null,
+ "implements": []
+ },
+ "Accelerometer": {
+ "inherits": "Sensor",
+ "implements": []
+ },
+ "AmbientLightSensor": {
+ "inherits": "Sensor",
+ "implements": []
+ },
+ "AnalyserNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "AnimationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "ArchiveRequest": {
+ "inherits": "DOMRequest",
+ "implements": []
+ },
+ "Attr": {
+ "inherits": "Node",
+ "implements": []
+ },
+ "AudioBufferSourceNode": {
+ "inherits": "AudioScheduledSourceNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "AudioChannelManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "AudioContext": {
+ "inherits": "BaseAudioContext",
+ "implements": []
+ },
+ "AudioDestinationNode": {
+ "inherits": "AudioNode",
+ "implements": []
+ },
+ "AudioNode": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "AudioProcessingEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "AudioScheduledSourceNode": {
+ "inherits": "AudioNode",
+ "implements": []
+ },
+ "AudioStreamTrack": {
+ "inherits": "MediaStreamTrack",
+ "implements": []
+ },
+ "AudioTrackList": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "AutocompleteErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BarProp": {
+ "inherits": null,
+ "implements": []
+ },
+ "BaseAudioContext": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BatteryManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BeforeAfterKeyboardEvent": {
+ "inherits": "KeyboardEvent",
+ "implements": []
+ },
+ "BeforeInstallPromptEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BeforeUnloadEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BiquadFilterNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "BlobEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothAdapter": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BluetoothAdapterEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothAttributeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothDevice": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BluetoothDeviceEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothDiscoveryHandle": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BluetoothDiscoveryStateChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothGatt": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BluetoothManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BluetoothPairingEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BluetoothStatusChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "BoxObject": {
+ "inherits": null,
+ "implements": []
+ },
+ "BroadcastChannel": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "BrowserElement": {
+ "inherits": null,
+ "implements": [
+ "BrowserElementCommon",
+ "BrowserElementPrivileged"
+ ]
+ },
+ "CDATASection": {
+ "inherits": "Text",
+ "implements": []
+ },
+ "CFStateChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CSSCounterStyleRule": {
+ "inherits": "CSSRule",
+ "implements": []
+ },
+ "CSSFontFaceLoadEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CSSImageValue": {
+ "inherits": "CSSStyleValue",
+ "implements": []
+ },
+ "CSSKeywordValue": {
+ "inherits": "CSSStyleValue",
+ "implements": []
+ },
+ "CSSMathInvert": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathMax": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathMin": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathNegate": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathProduct": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathSum": {
+ "inherits": "CSSMathValue",
+ "implements": []
+ },
+ "CSSMathValue": {
+ "inherits": "CSSNumericValue",
+ "implements": [
+ "CSSMathInvert",
+ "CSSMathMax",
+ "CSSMathMin",
+ "CSSMathNegate",
+ "CSSMathProduct",
+ "CSSMathSum"
+ ]
+ },
+ "CSSMatrixComponent": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSNumericValue": {
+ "inherits": "CSSStyleValue",
+ "implements": [
+ "CSSMathValue",
+ "CSSUnitValue"
+ ]
+ },
+ "CSSPerspective": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSPositionValue": {
+ "inherits": "CSSStyleValue",
+ "implements": []
+ },
+ "CSSPrimitiveValue": {
+ "inherits": "CSSValue",
+ "implements": []
+ },
+ "CSSPseudoElement": {
+ "inherits": "EventTarget",
+ "implements": [
+ "Animatable"
+ ]
+ },
+ "CSSRotate": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSScale": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSSkew": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSSkewX": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSSkewY": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSStyleDeclaration": {
+ "inherits": null,
+ "implements": []
+ },
+ "CSSStyleSheet": {
+ "inherits": "StyleSheet",
+ "implements": []
+ },
+ "CSSStyleValue": {
+ "inherits": null,
+ "implements": [
+ "CSSImageValue",
+ "CSSKeywordValue",
+ "CSSNumericValue",
+ "CSSPositionValue",
+ "CSSTransformValue",
+ "CSSUnitValue",
+ "CSSUnparsedValue"
+ ]
+ },
+ "CSSTransformComponent": {
+ "inherits": null,
+ "implements": [
+ "CSSMatrixComponent",
+ "CSSPerspective",
+ "CSSRotate",
+ "CSSScale",
+ "CSSSkew",
+ "CSSSkewX",
+ "CSSSkewY",
+ "CSSTranslate"
+ ]
+ },
+ "CSSTransformValue": {
+ "inherits": "CSSStyleValue",
+ "implements": []
+ },
+ "CSSTranslate": {
+ "inherits": "CSSTransformComponent",
+ "implements": []
+ },
+ "CSSUnitValue": {
+ "inherits": "CSSNumericValue",
+ "implements": []
+ },
+ "CSSUnparsedValue": {
+ "inherits": "CSSStyleValue",
+ "implements": []
+ },
+ "CSSValueList": {
+ "inherits": "CSSValue",
+ "implements": []
+ },
+ "CallEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CallGroupErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CameraClosedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CameraConfigurationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CameraControl": {
+ "inherits": "MediaStream",
+ "implements": []
+ },
+ "CameraFacesDetectedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CameraStateChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CanvasCaptureMediaStream": {
+ "inherits": "MediaStream",
+ "implements": []
+ },
+ "CaretPosition": {
+ "inherits": null,
+ "implements": []
+ },
+ "ChannelMergerNode": {
+ "inherits": "AudioNode",
+ "implements": []
+ },
+ "ChannelSplitterNode": {
+ "inherits": "AudioNode",
+ "implements": []
+ },
+ "CharacterData": {
+ "inherits": "Node",
+ "implements": [
+ "ChildNode",
+ "NonDocumentTypeChildNode"
+ ]
+ },
+ "ChromeWorker": {
+ "inherits": "Worker",
+ "implements": []
+ },
+ "Clipboard": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ClipboardEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CloseEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "CommandEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Comment": {
+ "inherits": "CharacterData",
+ "implements": []
+ },
+ "CompositionEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "ConstantSourceNode": {
+ "inherits": "AudioScheduledSourceNode",
+ "implements": []
+ },
+ "ContactManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ContainerBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "ConvolverNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "Crypto": {
+ "inherits": null,
+ "implements": []
+ },
+ "CustomEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DOMApplication": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DOMApplicationsManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DOMCursor": {
+ "inherits": "EventTarget",
+ "implements": [
+ "DOMRequestShared"
+ ]
+ },
+ "DOMDownload": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DOMDownloadManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DOMException": {
+ "inherits": null,
+ "implements": [
+ "ExceptionMembers"
+ ]
+ },
+ "DOMImplementation": {
+ "inherits": null,
+ "implements": []
+ },
+ "DOMMatrix": {
+ "inherits": "DOMMatrixReadOnly",
+ "implements": []
+ },
+ "DOMMobileMessageError": {
+ "inherits": "DOMError",
+ "implements": []
+ },
+ "DOMParser": {
+ "inherits": null,
+ "implements": []
+ },
+ "DOMPoint": {
+ "inherits": "DOMPointReadOnly",
+ "implements": []
+ },
+ "DOMRect": {
+ "inherits": "DOMRectReadOnly",
+ "implements": []
+ },
+ "DOMRequest": {
+ "inherits": "EventTarget",
+ "implements": [
+ "DOMRequestShared"
+ ]
+ },
+ "DOMSettableTokenList": {
+ "inherits": "DOMTokenList",
+ "implements": []
+ },
+ "DOMStringMap": {
+ "inherits": null,
+ "implements": []
+ },
+ "DOMTokenList": {
+ "inherits": null,
+ "implements": []
+ },
+ "DOMTransactionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DataContainerEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DataErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DataStore": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DataStoreChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DedicatedWorkerGlobalScope": {
+ "inherits": "WorkerGlobalScope",
+ "implements": []
+ },
+ "DelayNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "DesktopNotification": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DeviceLightEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DeviceMotionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DeviceOrientationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DeviceProximityEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DeviceStorage": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "DeviceStorageChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Document": {
+ "inherits": "Node",
+ "implements": [
+ "FontFaceSource",
+ "GeometryUtils",
+ "GlobalEventHandlers",
+ "OnErrorEventHandlerForNodes",
+ "ParentNode",
+ "TouchEventHandlers",
+ "XPathEvaluator"
+ ]
+ },
+ "DocumentFragment": {
+ "inherits": "Node",
+ "implements": [
+ "ParentNode"
+ ]
+ },
+ "DocumentType": {
+ "inherits": "Node",
+ "implements": [
+ "ChildNode"
+ ]
+ },
+ "DownloadEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "DragEvent": {
+ "inherits": "MouseEvent",
+ "implements": []
+ },
+ "DynamicsCompressorNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "Element": {
+ "inherits": "Node",
+ "implements": [
+ "Animatable",
+ "ChildNode",
+ "GeometryUtils",
+ "NonDocumentTypeChildNode",
+ "ParentNode"
+ ]
+ },
+ "EngineeringMode": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Event": {
+ "inherits": null,
+ "implements": []
+ },
+ "EventSource": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "Exception": {
+ "inherits": null,
+ "implements": [
+ "ExceptionMembers"
+ ]
+ },
+ "ExtendableEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "FMRadio": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "FetchEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "File": {
+ "inherits": "Blob",
+ "implements": []
+ },
+ "FileList": {
+ "inherits": null,
+ "implements": []
+ },
+ "FileReader": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "FocusEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "FontFaceSet": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "FormData": {
+ "inherits": null,
+ "implements": []
+ },
+ "GainNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "GamepadAxisMoveEvent": {
+ "inherits": "GamepadEvent",
+ "implements": []
+ },
+ "GamepadButtonEvent": {
+ "inherits": "GamepadEvent",
+ "implements": []
+ },
+ "GamepadEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Gyroscope": {
+ "inherits": "Sensor",
+ "implements": []
+ },
+ "HMDVRDevice": {
+ "inherits": "VRDevice",
+ "implements": []
+ },
+ "HTMLAnchorElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "HTMLHyperlinkElementUtils",
+ "URLUtilsSearchParams"
+ ]
+ },
+ "HTMLAppletElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozFrameLoaderOwner",
+ "MozImageLoadingContent",
+ "MozObjectLoadingContent"
+ ]
+ },
+ "HTMLAreaElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "HTMLHyperlinkElementUtils",
+ "URLUtilsSearchParams"
+ ]
+ },
+ "HTMLAudioElement": {
+ "inherits": "HTMLMediaElement",
+ "implements": []
+ },
+ "HTMLBRElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLBaseElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLBodyElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "WindowEventHandlers"
+ ]
+ },
+ "HTMLButtonElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLCanvasElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLCollection": {
+ "inherits": null,
+ "implements": []
+ },
+ "HTMLContentElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDListElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDataElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDataListElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDirectoryElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDivElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLDocument": {
+ "inherits": "Document",
+ "implements": []
+ },
+ "HTMLElement": {
+ "inherits": "Element",
+ "implements": [
+ "GlobalEventHandlers",
+ "OnErrorEventHandlerForNodes",
+ "TouchEventHandlers"
+ ]
+ },
+ "HTMLEmbedElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozFrameLoaderOwner",
+ "MozImageLoadingContent",
+ "MozObjectLoadingContent"
+ ]
+ },
+ "HTMLFieldSetElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLFontElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLFormControlsCollection": {
+ "inherits": "HTMLCollection",
+ "implements": []
+ },
+ "HTMLFormElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLFrameElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozFrameLoaderOwner"
+ ]
+ },
+ "HTMLFrameSetElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "WindowEventHandlers"
+ ]
+ },
+ "HTMLHRElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLHeadElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLHeadingElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLHtmlElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLIFrameElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "BrowserElement",
+ "MozFrameLoaderOwner"
+ ]
+ },
+ "HTMLImageElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozImageLoadingContent"
+ ]
+ },
+ "HTMLInputElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozImageLoadingContent",
+ "MozPhonetic"
+ ]
+ },
+ "HTMLLIElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLLabelElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLLegendElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLLinkElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "LinkStyle"
+ ]
+ },
+ "HTMLMapElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMarqueeElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMediaElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMenuElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMenuItemElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMetaElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLMeterElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLModElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLOListElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLObjectElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "MozFrameLoaderOwner",
+ "MozImageLoadingContent",
+ "MozObjectLoadingContent"
+ ]
+ },
+ "HTMLOptGroupElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLOptionElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLOptionsCollection": {
+ "inherits": "HTMLCollection",
+ "implements": []
+ },
+ "HTMLOutputElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLParagraphElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLParamElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLPictureElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLPreElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLProgressElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLPropertiesCollection": {
+ "inherits": "HTMLCollection",
+ "implements": []
+ },
+ "HTMLQuoteElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLScriptElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLSelectElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLShadowElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLSourceElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLSpanElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLStyleElement": {
+ "inherits": "HTMLElement",
+ "implements": [
+ "LinkStyle"
+ ]
+ },
+ "HTMLTableCaptionElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTableCellElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTableColElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTableElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTableRowElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTableSectionElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTemplateElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTextAreaElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTimeElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTitleElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLTrackElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLUListElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLUnknownElement": {
+ "inherits": "HTMLElement",
+ "implements": []
+ },
+ "HTMLVideoElement": {
+ "inherits": "HTMLMediaElement",
+ "implements": []
+ },
+ "HashChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "History": {
+ "inherits": null,
+ "implements": []
+ },
+ "IDBCursorWithValue": {
+ "inherits": "IDBCursor",
+ "implements": []
+ },
+ "IDBDatabase": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "IDBFileHandle": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "IDBFileRequest": {
+ "inherits": "DOMRequest",
+ "implements": []
+ },
+ "IDBMutableFile": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "IDBOpenDBRequest": {
+ "inherits": "IDBRequest",
+ "implements": []
+ },
+ "IDBRequest": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "IDBTransaction": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "IDBVersionChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "IccCardLockError": {
+ "inherits": "DOMError",
+ "implements": []
+ },
+ "IccChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "ImageCapture": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ImageCaptureErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "ImageDocument": {
+ "inherits": "HTMLDocument",
+ "implements": []
+ },
+ "InputEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "InstallEvent": {
+ "inherits": "ExtendableEvent",
+ "implements": []
+ },
+ "InstallTrigger": {
+ "inherits": null,
+ "implements": []
+ },
+ "KeyboardEvent": {
+ "inherits": "UIEvent",
+ "implements": [
+ "KeyEvent"
+ ]
+ },
+ "LinearAccelerationSensor": {
+ "inherits": "Accelerometer",
+ "implements": []
+ },
+ "ListBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "LocalMediaStream": {
+ "inherits": "MediaStream",
+ "implements": []
+ },
+ "Location": {
+ "inherits": null,
+ "implements": []
+ },
+ "Magnetometer": {
+ "inherits": "Sensor",
+ "implements": []
+ },
+ "MediaDevices": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MediaElementAudioSourceNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "MediaEncryptedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MediaKeyError": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MediaKeyMessageEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MediaKeySession": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MediaRecorder": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MediaSource": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MediaStream": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MediaStreamAudioDestinationNode": {
+ "inherits": "AudioNode",
+ "implements": []
+ },
+ "MediaStreamAudioSourceNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "MediaStreamEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MediaStreamTrackEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MenuBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "MerchantValidationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MessageEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MessagePort": {
+ "inherits": "EventTarget",
+ "implements": [
+ "Transferable"
+ ]
+ },
+ "MimeTypeArray": {
+ "inherits": null,
+ "implements": []
+ },
+ "MouseEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "MouseScrollEvent": {
+ "inherits": "MouseEvent",
+ "implements": []
+ },
+ "MozAbortablePromise": {
+ "inherits": "_Promise",
+ "implements": []
+ },
+ "MozActivity": {
+ "inherits": "DOMRequest",
+ "implements": []
+ },
+ "MozApplicationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozCdmaIccInfo": {
+ "inherits": "MozIccInfo",
+ "implements": []
+ },
+ "MozCellBroadcast": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozCellBroadcastEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozClirModeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozContactChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozEmergencyCbModeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozGsmIccInfo": {
+ "inherits": "MozIccInfo",
+ "implements": []
+ },
+ "MozIcc": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozIccManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozInputMethod": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozInterAppMessageEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozInterAppMessagePort": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozMessageDeletedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozMmsEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozMobileConnection": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozMobileMessageManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozNFC": {
+ "inherits": "EventTarget",
+ "implements": [
+ "MozNFCManager"
+ ]
+ },
+ "MozNFCPeerEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozNFCTagEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozOtaStatusEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozSettingsEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozSettingsTransactionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozSmsEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozSpeakerManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozStkCommandEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozVoicemail": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozVoicemailEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozWifiConnectionInfoEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozWifiManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "MozWifiStationInfoEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MozWifiStatusChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MutationEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "MutationObserver": {
+ "inherits": null,
+ "implements": []
+ },
+ "MutationRecord": {
+ "inherits": null,
+ "implements": []
+ },
+ "NamedNodeMap": {
+ "inherits": null,
+ "implements": []
+ },
+ "Navigator": {
+ "inherits": null,
+ "implements": [
+ "NavigatorBattery",
+ "NavigatorContentUtils",
+ "NavigatorDataStore",
+ "NavigatorFeatures",
+ "NavigatorGeolocation",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorMobileId",
+ "NavigatorOnLine",
+ "NavigatorStorageUtils"
+ ]
+ },
+ "NetworkInformation": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "Node": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "NodeIterator": {
+ "inherits": null,
+ "implements": []
+ },
+ "NodeList": {
+ "inherits": null,
+ "implements": []
+ },
+ "Notification": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "NotifyPaintEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "OfflineAudioCompletionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "OfflineAudioContext": {
+ "inherits": "BaseAudioContext",
+ "implements": []
+ },
+ "OfflineResourceList": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "OffscreenCanvas": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "OrientationSensor": {
+ "inherits": "Sensor",
+ "implements": []
+ },
+ "OscillatorNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "PageTransitionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PaintRequest": {
+ "inherits": null,
+ "implements": []
+ },
+ "PaintRequestList": {
+ "inherits": null,
+ "implements": []
+ },
+ "PannerNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "PaymentAddress": {
+ "inherits": null,
+ "implements": []
+ },
+ "PaymentMethodChangeEvent": {
+ "inherits": "PaymentRequestUpdateEvent",
+ "implements": []
+ },
+ "PaymentRequest": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "PaymentRequestUpdateEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PaymentResponse": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "Performance": {
+ "inherits": null,
+ "implements": []
+ },
+ "PerformanceLongTaskTiming": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "PerformanceMark": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "PerformanceMeasure": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "PerformanceNavigationTiming": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "PerformancePaintTiming": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "PerformanceResourceTiming": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "Plugin": {
+ "inherits": null,
+ "implements": []
+ },
+ "PluginArray": {
+ "inherits": null,
+ "implements": []
+ },
+ "PluginCrashedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PointerEvent": {
+ "inherits": "MouseEvent",
+ "implements": []
+ },
+ "PopStateEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PopupBlockedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PopupBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "PositionSensorVRDevice": {
+ "inherits": "VRDevice",
+ "implements": []
+ },
+ "PresentationDeviceInfoManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ProcessingInstruction": {
+ "inherits": "CharacterData",
+ "implements": []
+ },
+ "ProgressEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PromiseRejectionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "PropertyNodeList": {
+ "inherits": "NodeList",
+ "implements": []
+ },
+ "PseudoElement": {
+ "inherits": null,
+ "implements": [
+ "GeometryUtils"
+ ]
+ },
+ "RTCDTMFSender": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCDTMFToneChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RTCDataChannel": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCDataChannelEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RTCDtlsTransport": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCIceTransport": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCPeerConnection": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCPeerConnectionIceEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RTCPeerConnectionIdentityErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RTCPeerConnectionIdentityEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RTCSctpTransport": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "RTCTrackEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "RadioNodeList": {
+ "inherits": "NodeList",
+ "implements": []
+ },
+ "Range": {
+ "inherits": "AbstractRange",
+ "implements": []
+ },
+ "RecordErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Rect": {
+ "inherits": null,
+ "implements": []
+ },
+ "RelativeOrientationSensor": {
+ "inherits": "OrientationSensor",
+ "implements": []
+ },
+ "Request": {
+ "inherits": null,
+ "implements": [
+ "Body"
+ ]
+ },
+ "Response": {
+ "inherits": null,
+ "implements": [
+ "Body"
+ ]
+ },
+ "StaticRange": {
+ "inherits": "AbstractRange",
+ "implements": []
+ },
+ "SVGAElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGAltGlyphElement": {
+ "inherits": "SVGTextPositioningElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGAnimateElement": {
+ "inherits": "SVGAnimationElement",
+ "implements": []
+ },
+ "SVGAnimateMotionElement": {
+ "inherits": "SVGAnimationElement",
+ "implements": []
+ },
+ "SVGAnimateTransformElement": {
+ "inherits": "SVGAnimationElement",
+ "implements": []
+ },
+ "SVGAnimatedEnumeration": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimatedInteger": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimatedNumber": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimatedNumberList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimatedPreserveAspectRatio": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimatedString": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGAnimationElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGTests"
+ ]
+ },
+ "SVGCircleElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": []
+ },
+ "SVGClipPathElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGUnitTypes"
+ ]
+ },
+ "SVGComponentTransferFunctionElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGCursorElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGDefsElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGDescElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGDocument": {
+ "inherits": "Document",
+ "implements": []
+ },
+ "SVGElement": {
+ "inherits": "Element",
+ "implements": [
+ "GlobalEventHandlers",
+ "OnErrorEventHandlerForNodes",
+ "TouchEventHandlers"
+ ]
+ },
+ "SVGEllipseElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": []
+ },
+ "SVGFEBlendElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEColorMatrixElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEComponentTransferElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFECompositeElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEConvolveMatrixElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEDiffuseLightingElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEDisplacementMapElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEDistantLightElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGFEDropShadowElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEFloodElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEFuncAElement": {
+ "inherits": "SVGComponentTransferFunctionElement",
+ "implements": []
+ },
+ "SVGFEFuncBElement": {
+ "inherits": "SVGComponentTransferFunctionElement",
+ "implements": []
+ },
+ "SVGFEFuncGElement": {
+ "inherits": "SVGComponentTransferFunctionElement",
+ "implements": []
+ },
+ "SVGFEFuncRElement": {
+ "inherits": "SVGComponentTransferFunctionElement",
+ "implements": []
+ },
+ "SVGFEGaussianBlurElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEImageElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes",
+ "SVGURIReference"
+ ]
+ },
+ "SVGFEMergeElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEMergeNodeElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGFEMorphologyElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEOffsetElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFEPointLightElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGFESpecularLightingElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFESpotLightElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGFETileElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFETurbulenceElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFilterPrimitiveStandardAttributes"
+ ]
+ },
+ "SVGFilterElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGURIReference",
+ "SVGUnitTypes"
+ ]
+ },
+ "SVGForeignObjectElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGGElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGGeometryElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGGradientElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGURIReference",
+ "SVGUnitTypes"
+ ]
+ },
+ "SVGGraphicsElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGTests"
+ ]
+ },
+ "SVGImageElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": [
+ "MozImageLoadingContent",
+ "SVGURIReference"
+ ]
+ },
+ "SVGLengthList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGLineElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": []
+ },
+ "SVGLinearGradientElement": {
+ "inherits": "SVGGradientElement",
+ "implements": []
+ },
+ "SVGMPathElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGMarkerElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFitToViewBox"
+ ]
+ },
+ "SVGMaskElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGUnitTypes"
+ ]
+ },
+ "SVGMetadataElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGNumberList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGPathElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": [
+ "SVGAnimatedPathData"
+ ]
+ },
+ "SVGPathSegArcAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegArcRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegClosePath": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoCubicAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoCubicRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoCubicSmoothAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoCubicSmoothRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoQuadraticAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoQuadraticRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoQuadraticSmoothAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegCurvetoQuadraticSmoothRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoHorizontalAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoHorizontalRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoVerticalAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegLinetoVerticalRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGPathSegMovetoAbs": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPathSegMovetoRel": {
+ "inherits": "SVGPathSeg",
+ "implements": []
+ },
+ "SVGPatternElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFitToViewBox",
+ "SVGURIReference",
+ "SVGUnitTypes"
+ ]
+ },
+ "SVGPoint": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGPointList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGPolygonElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": [
+ "SVGAnimatedPoints"
+ ]
+ },
+ "SVGPolylineElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": [
+ "SVGAnimatedPoints"
+ ]
+ },
+ "SVGPreserveAspectRatio": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGRadialGradientElement": {
+ "inherits": "SVGGradientElement",
+ "implements": []
+ },
+ "SVGRect": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGRectElement": {
+ "inherits": "SVGGeometryElement",
+ "implements": []
+ },
+ "SVGSVGElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": [
+ "SVGFitToViewBox",
+ "SVGZoomAndPan"
+ ]
+ },
+ "SVGScriptElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGSetElement": {
+ "inherits": "SVGAnimationElement",
+ "implements": []
+ },
+ "SVGStopElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGStringList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGStyleElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGSwitchElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGSymbolElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFitToViewBox",
+ "SVGTests"
+ ]
+ },
+ "SVGTSpanElement": {
+ "inherits": "SVGTextPositioningElement",
+ "implements": []
+ },
+ "SVGTextContentElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": []
+ },
+ "SVGTextElement": {
+ "inherits": "SVGTextPositioningElement",
+ "implements": []
+ },
+ "SVGTextPathElement": {
+ "inherits": "SVGTextContentElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGTextPositioningElement": {
+ "inherits": "SVGTextContentElement",
+ "implements": []
+ },
+ "SVGTitleElement": {
+ "inherits": "SVGElement",
+ "implements": []
+ },
+ "SVGTransformList": {
+ "inherits": null,
+ "implements": []
+ },
+ "SVGUseElement": {
+ "inherits": "SVGGraphicsElement",
+ "implements": [
+ "SVGURIReference"
+ ]
+ },
+ "SVGViewElement": {
+ "inherits": "SVGElement",
+ "implements": [
+ "SVGFitToViewBox",
+ "SVGZoomAndPan"
+ ]
+ },
+ "SVGZoomEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "Screen": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ScriptProcessorNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "ScrollAreaEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "ScrollBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "ScrollViewChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Selection": {
+ "inherits": null,
+ "implements": []
+ },
+ "SelectionStateChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Sensor": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SensorErrorEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "ServiceWorker": {
+ "inherits": "EventTarget",
+ "implements": [
+ "AbstractWorker"
+ ]
+ },
+ "ServiceWorkerContainer": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ServiceWorkerGlobalScope": {
+ "inherits": "WorkerGlobalScope",
+ "implements": [
+ "GlobalFetch"
+ ]
+ },
+ "ServiceWorkerRegistration": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SettingsLock": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SettingsManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ShadowRoot": {
+ "inherits": "DocumentFragment",
+ "implements": []
+ },
+ "SharedWorker": {
+ "inherits": "EventTarget",
+ "implements": [
+ "AbstractWorker"
+ ]
+ },
+ "SharedWorkerGlobalScope": {
+ "inherits": "WorkerGlobalScope",
+ "implements": []
+ },
+ "SimpleGestureEvent": {
+ "inherits": "MouseEvent",
+ "implements": []
+ },
+ "SourceBuffer": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SourceBufferList": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SpeechRecognition": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "SpeechRecognitionError": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "SpeechRecognitionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "SpeechSynthesisEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "SpeechSynthesisUtterance": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "StereoPannerNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "StorageEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "StylePropertyMap": {
+ "inherits": "StylePropertyMapReadOnly",
+ "implements": []
+ },
+ "StylePropertyMapReadOnly": {
+ "inherits": null,
+ "implements": [
+ "StylePropertyMap"
+ ]
+ },
+ "StyleRuleChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "StyleSheet": {
+ "inherits": null,
+ "implements": []
+ },
+ "StyleSheetApplicableStateChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "StyleSheetChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "SyncEvent": {
+ "inherits": "ExtendableEvent",
+ "implements": []
+ },
+ "TVChannel": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TVCurrentChannelChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TVCurrentSourceChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TVEITBroadcastedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TVManager": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TVScanningStateChangedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TVSource": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TVTuner": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TaskAttributionTiming": {
+ "inherits": "PerformanceEntry",
+ "implements": []
+ },
+ "Telephony": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TelephonyCall": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TelephonyCallGroup": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "Text": {
+ "inherits": "CharacterData",
+ "implements": [
+ "GeometryUtils"
+ ]
+ },
+ "TextTrack": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TextTrackList": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "TimeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "Touch": {
+ "inherits": null,
+ "implements": []
+ },
+ "TouchEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "TouchList": {
+ "inherits": null,
+ "implements": []
+ },
+ "TrackEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TransitionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "TreeBoxObject": {
+ "inherits": "BoxObject",
+ "implements": []
+ },
+ "TreeColumns": {
+ "inherits": null,
+ "implements": []
+ },
+ "TreeWalker": {
+ "inherits": null,
+ "implements": []
+ },
+ "UDPMessageEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "UDPSocket": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "UIEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "URL": {
+ "inherits": null,
+ "implements": [
+ "URLUtils",
+ "URLUtilsSearchParams"
+ ]
+ },
+ "USSDReceivedEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "UndoManager": {
+ "inherits": null,
+ "implements": []
+ },
+ "UserProximityEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "VRFieldOfView": {
+ "inherits": "VRFieldOfViewReadOnly",
+ "implements": []
+ },
+ "VTTCue": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "ValidityState": {
+ "inherits": null,
+ "implements": []
+ },
+ "VideoStreamTrack": {
+ "inherits": "MediaStreamTrack",
+ "implements": []
+ },
+ "VideoTrackList": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "WaveShaperNode": {
+ "inherits": "AudioNode",
+ "implements": [
+ "AudioNodePassThrough"
+ ]
+ },
+ "WebGL2RenderingContext": {
+ "inherits": "WebGLRenderingContext",
+ "implements": []
+ },
+ "WebGLContextEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "WebSocket": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "WheelEvent": {
+ "inherits": "MouseEvent",
+ "implements": []
+ },
+ "Window": {
+ "inherits": null,
+ "implements": [
+ "ChromeWindow",
+ "GlobalCrypto",
+ "GlobalEventHandlers",
+ "OnErrorEventHandlerForWindow",
+ "SpeechSynthesisGetter",
+ "TouchEventHandlers",
+ "WindowEventHandlers",
+ "WindowModal",
+ "WindowOrWorkerGlobalScope"
+ ]
+ },
+ "WindowClient": {
+ "inherits": "Client",
+ "implements": []
+ },
+ "WindowRoot": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "Worker": {
+ "inherits": "EventTarget",
+ "implements": [
+ "AbstractWorker"
+ ]
+ },
+ "WorkerGlobalScope": {
+ "inherits": "EventTarget",
+ "implements": [
+ "GlobalCrypto",
+ "WindowOrWorkerGlobalScope"
+ ]
+ },
+ "WorkerLocation": {
+ "inherits": null,
+ "implements": [
+ "URLUtilsReadOnly"
+ ]
+ },
+ "WorkerNavigator": {
+ "inherits": null,
+ "implements": [
+ "NavigatorDataStore",
+ "NavigatorID",
+ "NavigatorLanguage",
+ "NavigatorOnLine"
+ ]
+ },
+ "XMLDocument": {
+ "inherits": "Document",
+ "implements": []
+ },
+ "XMLHttpRequest": {
+ "inherits": "XMLHttpRequestEventTarget",
+ "implements": []
+ },
+ "XMLHttpRequestEventTarget": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "XMLHttpRequestUpload": {
+ "inherits": "XMLHttpRequestEventTarget",
+ "implements": []
+ },
+ "XMLSerializer": {
+ "inherits": null,
+ "implements": []
+ },
+ "XMLStylesheetProcessingInstruction": {
+ "inherits": "ProcessingInstruction",
+ "implements": []
+ },
+ "XPathEvaluator": {
+ "inherits": null,
+ "implements": []
+ },
+ "XR": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "XRBoundedReferenceSpace": {
+ "inherits": "XRReferenceSpace",
+ "implements": []
+ },
+ "XRFrame": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRInputSource": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRInputSourceArray": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRInputSourceEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "XRInputSourcesChangeEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "XRPose": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRReferenceSpace": {
+ "inherits": "XRSpace",
+ "implements": []
+ },
+ "XRReferenceSpaceEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "XRRenderState": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRRigidTransform": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRSession": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "XRSessionEvent": {
+ "inherits": "Event",
+ "implements": []
+ },
+ "XRSpace": {
+ "inherits": "EventTarget",
+ "implements": []
+ },
+ "XRView": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRViewerPose": {
+ "inherits": "XRPose",
+ "implements": []
+ },
+ "XRViewport": {
+ "inherits": null,
+ "implements": []
+ },
+ "XRWebGLLayer": {
+ "inherits": null,
+ "implements": []
+ },
+ "XULCommandEvent": {
+ "inherits": "UIEvent",
+ "implements": []
+ },
+ "XULDocument": {
+ "inherits": "Document",
+ "implements": []
+ },
+ "XULElement": {
+ "inherits": "Element",
+ "implements": [
+ "GlobalEventHandlers",
+ "MozFrameLoaderOwner",
+ "OnErrorEventHandlerForNodes",
+ "TouchEventHandlers"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/api/inheritance.schema.json b/node_modules/csso/node_modules/mdn-data/api/inheritance.schema.json
new file mode 100644
index 0000000..706abbc
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/api/inheritance.schema.json
@@ -0,0 +1,31 @@
+{
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "inherits": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "string",
+ "minLength": 1
+ }
+ ]
+ },
+ "implements": {
+ "minItems": 0,
+ "uniqueItems": true,
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "inherits",
+ "implements"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/at-rules.json b/node_modules/csso/node_modules/mdn-data/css/at-rules.json
new file mode 100644
index 0000000..4003461
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/at-rules.json
@@ -0,0 +1,560 @@
+{
+ "@charset": {
+ "syntax": "@charset \"<charset>\";",
+ "groups": [
+ "CSS Charsets"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@charset"
+ },
+ "@counter-style": {
+ "syntax": "@counter-style <counter-style-name> {\n [ system: <counter-system>; ] ||\n [ symbols: <counter-symbols>; ] ||\n [ additive-symbols: <additive-symbols>; ] ||\n [ negative: <negative-symbol>; ] ||\n [ prefix: <prefix>; ] ||\n [ suffix: <suffix>; ] ||\n [ range: <range>; ] ||\n [ pad: <padding>; ] ||\n [ speak-as: <speak-as>; ] ||\n [ fallback: <counter-style-name>; ]\n}",
+ "interfaces": [
+ "CSSCounterStyleRule"
+ ],
+ "groups": [
+ "CSS Counter Styles"
+ ],
+ "descriptors": {
+ "additive-symbols": {
+ "syntax": "[ <integer> && <symbol> ]#",
+ "media": "all",
+ "initial": "n/a (required)",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "fallback": {
+ "syntax": "<counter-style-name>",
+ "media": "all",
+ "initial": "decimal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "negative": {
+ "syntax": "<symbol> <symbol>?",
+ "media": "all",
+ "initial": "\"-\" hyphen-minus",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "pad": {
+ "syntax": "<integer> && <symbol>",
+ "media": "all",
+ "initial": "0 \"\"",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "prefix": {
+ "syntax": "<symbol>",
+ "media": "all",
+ "initial": "\"\"",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "range": {
+ "syntax": "[ [ <integer> | infinite ]{2} ]# | auto",
+ "media": "all",
+ "initial": "auto",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "speak-as": {
+ "syntax": "auto | bullets | numbers | words | spell-out | <counter-style-name>",
+ "media": "all",
+ "initial": "auto",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "suffix": {
+ "syntax": "<symbol>",
+ "media": "all",
+ "initial": "\". \"",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "symbols": {
+ "syntax": "<symbol>+",
+ "media": "all",
+ "initial": "n/a (required)",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "system": {
+ "syntax": "cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]",
+ "media": "all",
+ "initial": "symbolic",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ }
+ },
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@counter-style"
+ },
+ "@document": {
+ "syntax": "@document [ <url> | url-prefix(<string>) | domain(<string>) | media-document(<string>) | regexp(<string>) ]# {\n <group-rule-body>\n}",
+ "interfaces": [
+ "CSSGroupingRule",
+ "CSSConditionRule"
+ ],
+ "groups": [
+ "CSS Conditional Rules"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@document"
+ },
+ "@font-face": {
+ "syntax": "@font-face {\n [ font-family: <family-name>; ] ||\n [ src: <src>; ] ||\n [ unicode-range: <unicode-range>; ] ||\n [ font-variant: <font-variant>; ] ||\n [ font-feature-settings: <font-feature-settings>; ] ||\n [ font-variation-settings: <font-variation-settings>; ] ||\n [ font-stretch: <font-stretch>; ] ||\n [ font-weight: <font-weight>; ] ||\n [ font-style: <font-style>; ]\n}",
+ "interfaces": [
+ "CSSFontFaceRule"
+ ],
+ "groups": [
+ "CSS Fonts"
+ ],
+ "descriptors": {
+ "font-display": {
+ "syntax": "[ auto | block | swap | fallback | optional ]",
+ "media": "visual",
+ "percentages": "no",
+ "initial": "auto",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ },
+ "font-family": {
+ "syntax": "<family-name>",
+ "media": "all",
+ "initial": "n/a (required)",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "font-feature-settings": {
+ "syntax": "normal | <feature-tag-value>#",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "font-variation-settings": {
+ "syntax": "normal | [ <string> <number> ]#",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "font-stretch": {
+ "syntax": "<font-stretch-absolute>{1,2}",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "font-style": {
+ "syntax": "normal | italic | oblique <angle>{0,2}",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "font-weight": {
+ "syntax": "<font-weight-absolute>{1,2}",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "font-variant": {
+ "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+ "media": "all",
+ "initial": "normal",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "src": {
+ "syntax": "[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#",
+ "media": "all",
+ "initial": "n/a (required)",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "unicode-range": {
+ "syntax": "<unicode-range>#",
+ "media": "all",
+ "initial": "U+0-10FFFF",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ }
+ },
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@font-face"
+ },
+ "@font-feature-values": {
+ "syntax": "@font-feature-values <family-name># {\n <feature-value-block-list>\n}",
+ "interfaces": [
+ "CSSFontFeatureValuesRule"
+ ],
+ "groups": [
+ "CSS Fonts"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@font-feature-values"
+ },
+ "@import": {
+ "syntax": "@import [ <string> | <url> ] [ <media-query-list> ]?;",
+ "groups": [
+ "Media Queries"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@import"
+ },
+ "@keyframes": {
+ "syntax": "@keyframes <keyframes-name> {\n <keyframe-block-list>\n}",
+ "interfaces": [
+ "CSSKeyframeRule",
+ "CSSKeyframesRule"
+ ],
+ "groups": [
+ "CSS Animations"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@keyframes"
+ },
+ "@media": {
+ "syntax": "@media <media-query-list> {\n <group-rule-body>\n}",
+ "interfaces": [
+ "CSSGroupingRule",
+ "CSSConditionRule",
+ "CSSMediaRule",
+ "CSSCustomMediaRule"
+ ],
+ "groups": [
+ "CSS Conditional Rules",
+ "Media Queries"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@media"
+ },
+ "@namespace": {
+ "syntax": "@namespace <namespace-prefix>? [ <string> | <url> ];",
+ "groups": [
+ "CSS Namespaces"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@namespace"
+ },
+ "@page": {
+ "syntax": "@page <page-selector-list> {\n <page-body>\n}",
+ "interfaces": [
+ "CSSPageRule"
+ ],
+ "groups": [
+ "CSS Pages"
+ ],
+ "descriptors": {
+ "bleed": {
+ "syntax": "auto | <length>",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "initial": "auto",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "marks": {
+ "syntax": "none | [ crop || cross ]",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "initial": "none",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "size": {
+ "syntax": "<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "initial": "auto",
+ "percentages": "no",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "orderOfAppearance",
+ "status": "standard"
+ }
+ },
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@page"
+ },
+ "@property": {
+ "syntax": "@property <custom-property-name> {\n <declaration-list>\n}",
+ "interfaces": [
+ "CSS",
+ "CSSPropertyRule"
+ ],
+ "groups": [
+ "CSS Houdini"
+ ],
+ "descriptors": {
+ "syntax": {
+ "syntax": "<string>",
+ "media": "all",
+ "percentages": "no",
+ "initial": "n/a (required)",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ },
+ "inherits": {
+ "syntax": "true | false",
+ "media": "all",
+ "percentages": "no",
+ "initial": "auto",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ },
+ "initial-value": {
+ "syntax": "<string>",
+ "media": "all",
+ "initial": "n/a (required)",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ }
+ },
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@property"
+ },
+ "@supports": {
+ "syntax": "@supports <supports-condition> {\n <group-rule-body>\n}",
+ "interfaces": [
+ "CSSGroupingRule",
+ "CSSConditionRule",
+ "CSSSupportsRule"
+ ],
+ "groups": [
+ "CSS Conditional Rules"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@supports"
+ },
+ "@viewport": {
+ "syntax": "@viewport {\n <group-rule-body>\n}",
+ "interfaces": [
+ "CSSViewportRule"
+ ],
+ "groups": [
+ "CSS Device Adaptation"
+ ],
+ "descriptors": {
+ "height": {
+ "syntax": "<viewport-length>{1,2}",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": [
+ "min-height",
+ "max-height"
+ ],
+ "percentages": [
+ "min-height",
+ "max-height"
+ ],
+ "computed": [
+ "min-height",
+ "max-height"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "max-height": {
+ "syntax": "<viewport-length>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "referToHeightOfInitialViewport",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "max-width": {
+ "syntax": "<viewport-length>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "referToWidthOfInitialViewport",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "max-zoom": {
+ "syntax": "auto | <number> | <percentage>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "the zoom factor itself",
+ "computed": "autoNonNegativeOrPercentage",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "min-height": {
+ "syntax": "<viewport-length>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "referToHeightOfInitialViewport",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "min-width": {
+ "syntax": "<viewport-length>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "referToWidthOfInitialViewport",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "min-zoom": {
+ "syntax": "auto | <number> | <percentage>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "the zoom factor itself",
+ "computed": "autoNonNegativeOrPercentage",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "orientation": {
+ "syntax": "auto | portrait | landscape",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "referToSizeOfBoundingBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "user-zoom": {
+ "syntax": "zoom | fixed",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "zoom",
+ "percentages": "referToSizeOfBoundingBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "viewport-fit": {
+ "syntax": "auto | contain | cover",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "no",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard"
+ },
+ "width": {
+ "syntax": "<viewport-length>{1,2}",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": [
+ "min-width",
+ "max-width"
+ ],
+ "percentages": [
+ "min-width",
+ "max-width"
+ ],
+ "computed": [
+ "min-width",
+ "max-width"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard"
+ },
+ "zoom": {
+ "syntax": "auto | <number> | <percentage>",
+ "media": [
+ "visual",
+ "continuous"
+ ],
+ "initial": "auto",
+ "percentages": "the zoom factor itself",
+ "computed": "autoNonNegativeOrPercentage",
+ "order": "uniqueOrder",
+ "status": "standard"
+ }
+ },
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/@viewport"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/at-rules.schema.json b/node_modules/csso/node_modules/mdn-data/css/at-rules.schema.json
new file mode 100644
index 0000000..b69505c
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/at-rules.schema.json
@@ -0,0 +1,132 @@
+{
+ "definitions": {
+ "stringOrPropertyList": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "property-reference": {
+ "comment": "property-reference is an extension to the JSON schema validator. Here it jumps 3 levels up in the hierarchy and tests if a value is an existing key in descriptors. See test/validate-schema.js for implementation details.",
+ "$data": "3"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "syntax": {
+ "type": "string"
+ },
+ "interfaces": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "groups": {
+ "type": "array",
+ "minitems": 1,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "definitions.json#/groupList"
+ }
+ },
+ "descriptors": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "syntax": {
+ "type": "string"
+ },
+ "media": {
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "all",
+ "continuous",
+ "paged",
+ "visual"
+ ]
+ },
+ {
+ "type": "array",
+ "minItems": 2,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "enum": [
+ "continuous",
+ "paged",
+ "visual"
+ ]
+ }
+ }
+ ]
+ },
+ "initial": {
+ "$ref": "#/definitions/stringOrPropertyList"
+ },
+ "percentages": {
+ "$ref": "#/definitions/stringOrPropertyList"
+ },
+ "computed": {
+ "$ref": "#/definitions/stringOrPropertyList"
+ },
+ "order": {
+ "enum": [
+ "orderOfAppearance",
+ "uniqueOrder"
+ ]
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental"
+ ]
+ }
+ },
+ "required": [
+ "syntax",
+ "media",
+ "initial",
+ "percentages",
+ "computed",
+ "order",
+ "status"
+ ]
+ }
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental"
+ ]
+ },
+ "mdn_url": {
+ "type": "string",
+ "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+ }
+ },
+ "required": [
+ "syntax",
+ "groups",
+ "status"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/definitions.json b/node_modules/csso/node_modules/mdn-data/css/definitions.json
new file mode 100644
index 0000000..5d5b200
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/definitions.json
@@ -0,0 +1,77 @@
+{
+ "groupList": {
+ "enum": [
+ "Basic Selectors",
+ "Combinators",
+ "Compositing and Blending",
+ "CSS Angles",
+ "CSS Animations",
+ "CSS Backgrounds and Borders",
+ "CSS Box Model",
+ "CSS Box Alignment",
+ "CSS Break",
+ "CSS Charsets",
+ "CSS Color",
+ "CSS Columns",
+ "CSS Conditional Rules",
+ "CSS Containment",
+ "CSS Counter Styles",
+ "CSS Device Adaptation",
+ "CSS Display",
+ "CSS Flexible Box Layout",
+ "CSS Flexible Lengths",
+ "CSS Fonts",
+ "CSS Fragmentation",
+ "CSS Frequencies",
+ "CSS Generated Content",
+ "CSS Grid Layout",
+ "CSS Houdini",
+ "CSS Images",
+ "CSS Inline",
+ "CSS Lengths",
+ "CSS Lists and Counters",
+ "CSS Logical Properties",
+ "CSS Masking",
+ "CSS Miscellaneous",
+ "CSS Motion Path",
+ "CSS Namespaces",
+ "CSS Overflow",
+ "CSS Pages",
+ "CSS Positioning",
+ "CSS Regions",
+ "CSS Resolutions",
+ "CSS Ruby",
+ "CSS Scroll Anchoring",
+ "CSS Scrollbars",
+ "CSS Scroll Snap",
+ "CSS Shadow Parts",
+ "CSS Shapes",
+ "CSS Speech",
+ "CSS Table",
+ "CSS Text",
+ "CSS Text Decoration",
+ "CSS Times",
+ "CSS Transforms",
+ "CSS Transitions",
+ "CSS Types",
+ "CSS Units",
+ "CSS Basic User Interface",
+ "CSS Variables",
+ "CSS Will Change",
+ "CSS Writing Modes",
+ "CSSOM View",
+ "Filter Effects",
+ "Grouping Selectors",
+ "MathML",
+ "Media Queries",
+ "Microsoft Extensions",
+ "Mozilla Extensions",
+ "Pointer Events",
+ "Pseudo",
+ "Pseudo-classes",
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/index.js b/node_modules/csso/node_modules/mdn-data/css/index.js
new file mode 100644
index 0000000..c258137
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/index.js
@@ -0,0 +1,8 @@
+module.exports = {
+ atRules: require('./at-rules'),
+ selectors: require('./selectors'),
+ types: require('./types'),
+ properties: require('./properties'),
+ syntaxes: require('./syntaxes'),
+ units: require('./units'),
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/properties.json b/node_modules/csso/node_modules/mdn-data/css/properties.json
new file mode 100644
index 0000000..d06a918
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/properties.json
@@ -0,0 +1,9163 @@
+{
+ "--*": {
+ "syntax": "<declaration-value>",
+ "media": "all",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Variables"
+ ],
+ "initial": "seeProse",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedWithVarsSubstituted",
+ "order": "perGrammar",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/--*"
+ },
+ "-ms-accelerator": {
+ "syntax": "false | true",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "false",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-accelerator"
+ },
+ "-ms-block-progression": {
+ "syntax": "tb | rl | bt | lr",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "tb",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-block-progression"
+ },
+ "-ms-content-zoom-chaining": {
+ "syntax": "none | chained",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-chaining"
+ },
+ "-ms-content-zooming": {
+ "syntax": "none | zoom",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "zoomForTheTopLevelNoneForTheRest",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zooming"
+ },
+ "-ms-content-zoom-limit": {
+ "syntax": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": [
+ "-ms-content-zoom-limit-max",
+ "-ms-content-zoom-limit-min"
+ ],
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": [
+ "-ms-content-zoom-limit-max",
+ "-ms-content-zoom-limit-min"
+ ],
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": [
+ "-ms-content-zoom-limit-max",
+ "-ms-content-zoom-limit-min"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit"
+ },
+ "-ms-content-zoom-limit-max": {
+ "syntax": "<percentage>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "maxZoomFactor",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "400%",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit-max"
+ },
+ "-ms-content-zoom-limit-min": {
+ "syntax": "<percentage>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "minZoomFactor",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "100%",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-limit-min"
+ },
+ "-ms-content-zoom-snap": {
+ "syntax": "<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": [
+ "-ms-content-zoom-snap-type",
+ "-ms-content-zoom-snap-points"
+ ],
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": [
+ "-ms-content-zoom-snap-type",
+ "-ms-content-zoom-snap-points"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap"
+ },
+ "-ms-content-zoom-snap-points": {
+ "syntax": "snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "snapInterval(0%, 100%)",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap-points"
+ },
+ "-ms-content-zoom-snap-type": {
+ "syntax": "none | proximity | mandatory",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-content-zoom-snap-type"
+ },
+ "-ms-filter": {
+ "syntax": "<string>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "\"\"",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-filter"
+ },
+ "-ms-flow-from": {
+ "syntax": "[ none | <custom-ident> ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "nonReplacedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-flow-from"
+ },
+ "-ms-flow-into": {
+ "syntax": "[ none | <custom-ident> ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "iframeElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-flow-into"
+ },
+ "-ms-grid-columns": {
+ "syntax": "none | <track-list> | <auto-track-list>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpcDifferenceLpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "none",
+ "appliesto": "gridContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-grid-columns"
+ },
+ "-ms-grid-rows": {
+ "syntax": "none | <track-list> | <auto-track-list>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpcDifferenceLpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "none",
+ "appliesto": "gridContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-grid-rows"
+ },
+ "-ms-high-contrast-adjust": {
+ "syntax": "auto | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-high-contrast-adjust"
+ },
+ "-ms-hyphenate-limit-chars": {
+ "syntax": "auto | <integer>{1,3}",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-chars"
+ },
+ "-ms-hyphenate-limit-lines": {
+ "syntax": "no-limit | <integer>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "no-limit",
+ "appliesto": "blockContainerElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-lines"
+ },
+ "-ms-hyphenate-limit-zone": {
+ "syntax": "<percentage> | <length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "referToLineBoxWidth",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "blockContainerElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-hyphenate-limit-zone"
+ },
+ "-ms-ime-align": {
+ "syntax": "auto | after",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-ime-align"
+ },
+ "-ms-overflow-style": {
+ "syntax": "auto | none | scrollbar | -ms-autohiding-scrollbar",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-overflow-style"
+ },
+ "-ms-scrollbar-3dlight-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "dependsOnUserAgent",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-3dlight-color"
+ },
+ "-ms-scrollbar-arrow-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "ButtonText",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-arrow-color"
+ },
+ "-ms-scrollbar-base-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "dependsOnUserAgent",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-base-color"
+ },
+ "-ms-scrollbar-darkshadow-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "ThreeDDarkShadow",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-darkshadow-color"
+ },
+ "-ms-scrollbar-face-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "ThreeDFace",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-face-color"
+ },
+ "-ms-scrollbar-highlight-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "ThreeDHighlight",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-highlight-color"
+ },
+ "-ms-scrollbar-shadow-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "ThreeDDarkShadow",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-shadow-color"
+ },
+ "-ms-scrollbar-track-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "Scrollbar",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-track-color"
+ },
+ "-ms-scroll-chaining": {
+ "syntax": "chained | none",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "chained",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-chaining"
+ },
+ "-ms-scroll-limit": {
+ "syntax": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": [
+ "-ms-scroll-limit-x-min",
+ "-ms-scroll-limit-y-min",
+ "-ms-scroll-limit-x-max",
+ "-ms-scroll-limit-y-max"
+ ],
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": [
+ "-ms-scroll-limit-x-min",
+ "-ms-scroll-limit-y-min",
+ "-ms-scroll-limit-x-max",
+ "-ms-scroll-limit-y-max"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit"
+ },
+ "-ms-scroll-limit-x-max": {
+ "syntax": "auto | <length>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-x-max"
+ },
+ "-ms-scroll-limit-x-min": {
+ "syntax": "<length>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-x-min"
+ },
+ "-ms-scroll-limit-y-max": {
+ "syntax": "auto | <length>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-y-max"
+ },
+ "-ms-scroll-limit-y-min": {
+ "syntax": "<length>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-limit-y-min"
+ },
+ "-ms-scroll-rails": {
+ "syntax": "none | railed",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "railed",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-rails"
+ },
+ "-ms-scroll-snap-points-x": {
+ "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "snapInterval(0px, 100%)",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-points-x"
+ },
+ "-ms-scroll-snap-points-y": {
+ "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "snapInterval(0px, 100%)",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-points-y"
+ },
+ "-ms-scroll-snap-type": {
+ "syntax": "none | proximity | mandatory",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-type"
+ },
+ "-ms-scroll-snap-x": {
+ "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": [
+ "-ms-scroll-snap-type",
+ "-ms-scroll-snap-points-x"
+ ],
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": [
+ "-ms-scroll-snap-type",
+ "-ms-scroll-snap-points-x"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-x"
+ },
+ "-ms-scroll-snap-y": {
+ "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": [
+ "-ms-scroll-snap-type",
+ "-ms-scroll-snap-points-y"
+ ],
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": [
+ "-ms-scroll-snap-type",
+ "-ms-scroll-snap-points-y"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-snap-y"
+ },
+ "-ms-scroll-translation": {
+ "syntax": "none | vertical-to-horizontal",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scroll-translation"
+ },
+ "-ms-text-autospace": {
+ "syntax": "none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-text-autospace"
+ },
+ "-ms-touch-select": {
+ "syntax": "grippers | none",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "grippers",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-touch-select"
+ },
+ "-ms-user-select": {
+ "syntax": "none | element | text",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "text",
+ "appliesto": "nonReplacedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-user-select"
+ },
+ "-ms-wrap-flow": {
+ "syntax": "auto | both | start | end | maximum | clear",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-flow"
+ },
+ "-ms-wrap-margin": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "exclusionElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-margin"
+ },
+ "-ms-wrap-through": {
+ "syntax": "wrap | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "wrap",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-ms-wrap-through"
+ },
+ "-moz-appearance": {
+ "syntax": "none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "noneButOverriddenInUserAgentCSS",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+ },
+ "-moz-binding": {
+ "syntax": "<url> | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsExceptGeneratedContentOrPseudoElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-binding"
+ },
+ "-moz-border-bottom-colors": {
+ "syntax": "<color>+ | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-bottom-colors"
+ },
+ "-moz-border-left-colors": {
+ "syntax": "<color>+ | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-left-colors"
+ },
+ "-moz-border-right-colors": {
+ "syntax": "<color>+ | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-right-colors"
+ },
+ "-moz-border-top-colors": {
+ "syntax": "<color>+ | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-border-top-colors"
+ },
+ "-moz-context-properties": {
+ "syntax": "none | [ fill | fill-opacity | stroke | stroke-opacity ]#",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsThatCanReferenceImages",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-context-properties"
+ },
+ "-moz-float-edge": {
+ "syntax": "border-box | content-box | margin-box | padding-box",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "content-box",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge"
+ },
+ "-moz-force-broken-image-icon": {
+ "syntax": "<integer [0,1]>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "images",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon"
+ },
+ "-moz-image-region": {
+ "syntax": "<shape> | auto",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "xulImageElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-image-region"
+ },
+ "-moz-orient": {
+ "syntax": "inline | block | horizontal | vertical",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "inline",
+ "appliesto": "anyElementEffectOnProgressAndMeter",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-orient"
+ },
+ "-moz-outline-radius": {
+ "syntax": "<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "-moz-outline-radius-topleft",
+ "-moz-outline-radius-topright",
+ "-moz-outline-radius-bottomright",
+ "-moz-outline-radius-bottomleft"
+ ],
+ "percentages": [
+ "-moz-outline-radius-topleft",
+ "-moz-outline-radius-topright",
+ "-moz-outline-radius-bottomright",
+ "-moz-outline-radius-bottomleft"
+ ],
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": [
+ "-moz-outline-radius-topleft",
+ "-moz-outline-radius-topright",
+ "-moz-outline-radius-bottomright",
+ "-moz-outline-radius-bottomleft"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "-moz-outline-radius-topleft",
+ "-moz-outline-radius-topright",
+ "-moz-outline-radius-bottomright",
+ "-moz-outline-radius-bottomleft"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius"
+ },
+ "-moz-outline-radius-bottomleft": {
+ "syntax": "<outline-radius>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft"
+ },
+ "-moz-outline-radius-bottomright": {
+ "syntax": "<outline-radius>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright"
+ },
+ "-moz-outline-radius-topleft": {
+ "syntax": "<outline-radius>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft"
+ },
+ "-moz-outline-radius-topright": {
+ "syntax": "<outline-radius>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright"
+ },
+ "-moz-stack-sizing": {
+ "syntax": "ignore | stretch-to-fit",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "stretch-to-fit",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-stack-sizing"
+ },
+ "-moz-text-blink": {
+ "syntax": "none | blink",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-text-blink"
+ },
+ "-moz-user-focus": {
+ "syntax": "ignore | normal | select-after | select-before | select-menu | select-same | select-all | none",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus"
+ },
+ "-moz-user-input": {
+ "syntax": "auto | none | enabled | disabled",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-input"
+ },
+ "-moz-user-modify": {
+ "syntax": "read-only | read-write | write-only",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "read-only",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-modify"
+ },
+ "-moz-window-dragging": {
+ "syntax": "drag | no-drag",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "drag",
+ "appliesto": "allElementsCreatingNativeWindows",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-window-dragging"
+ },
+ "-moz-window-shadow": {
+ "syntax": "default | menu | tooltip | sheet | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "default",
+ "appliesto": "allElementsCreatingNativeWindows",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-moz-window-shadow"
+ },
+ "-webkit-appearance": {
+ "syntax": "none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "noneButOverriddenInUserAgentCSS",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+ },
+ "-webkit-border-before": {
+ "syntax": "<'border-width'> || <'border-style'> || <'color'>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": [
+ "-webkit-border-before-width"
+ ],
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": [
+ "border-width",
+ "border-style",
+ "color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-width",
+ "border-style",
+ "color"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before"
+ },
+ "-webkit-border-before-color": {
+ "syntax": "<'color'>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "nonstandard"
+ },
+ "-webkit-border-before-style": {
+ "syntax": "<'border-style'>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard"
+ },
+ "-webkit-border-before-width": {
+ "syntax": "<'border-width'>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "nonstandard"
+ },
+ "-webkit-box-reflect": {
+ "syntax": "[ above | below | right | left ]? <length>? <image>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect"
+ },
+ "-webkit-line-clamp": {
+ "syntax": "none | <integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions",
+ "CSS Overflow"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp"
+ },
+ "-webkit-mask": {
+ "syntax": "[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": [
+ "-webkit-mask-image",
+ "-webkit-mask-repeat",
+ "-webkit-mask-attachment",
+ "-webkit-mask-position",
+ "-webkit-mask-origin",
+ "-webkit-mask-clip"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "-webkit-mask-image",
+ "-webkit-mask-repeat",
+ "-webkit-mask-attachment",
+ "-webkit-mask-position",
+ "-webkit-mask-origin",
+ "-webkit-mask-clip"
+ ],
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask"
+ },
+ "-webkit-mask-attachment": {
+ "syntax": "<attachment>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "scroll",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment"
+ },
+ "-webkit-mask-clip": {
+ "syntax": "[ <box> | border | padding | content | text ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "border",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-clip"
+ },
+ "-webkit-mask-composite": {
+ "syntax": "<composite-style>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "source-over",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite"
+ },
+ "-webkit-mask-image": {
+ "syntax": "<mask-reference>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "absoluteURIOrNone",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-image"
+ },
+ "-webkit-mask-origin": {
+ "syntax": "[ <box> | border | padding | content ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "padding",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-origin"
+ },
+ "-webkit-mask-position": {
+ "syntax": "<position>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToSizeOfElement",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "0% 0%",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOrPercentage",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-position"
+ },
+ "-webkit-mask-position-x": {
+ "syntax": "[ <length-percentage> | left | center | right ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToSizeOfElement",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "0%",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOrPercentage",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x"
+ },
+ "-webkit-mask-position-y": {
+ "syntax": "[ <length-percentage> | top | center | bottom ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToSizeOfElement",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "0%",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOrPercentage",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y"
+ },
+ "-webkit-mask-repeat": {
+ "syntax": "<repeat-style>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "repeat",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-repeat"
+ },
+ "-webkit-mask-repeat-x": {
+ "syntax": "repeat | no-repeat | space | round",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "repeat",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x"
+ },
+ "-webkit-mask-repeat-y": {
+ "syntax": "repeat | no-repeat | space | round",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "repeat",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOrPercentage",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y"
+ },
+ "-webkit-mask-size": {
+ "syntax": "<bg-size>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "relativeToBackgroundPositioningArea",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "auto auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-size"
+ },
+ "-webkit-overflow-scrolling": {
+ "syntax": "auto | touch",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollingBoxes",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling"
+ },
+ "-webkit-tap-highlight-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "black",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color"
+ },
+ "-webkit-text-fill-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color"
+ },
+ "-webkit-text-stroke": {
+ "syntax": "<length> || <color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": [
+ "-webkit-text-stroke-width",
+ "-webkit-text-stroke-color"
+ ],
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": [
+ "-webkit-text-stroke-width",
+ "-webkit-text-stroke-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "-webkit-text-stroke-width",
+ "-webkit-text-stroke-color"
+ ],
+ "order": "canonicalOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke"
+ },
+ "-webkit-text-stroke-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color"
+ },
+ "-webkit-text-stroke-width": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "absoluteLength",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width"
+ },
+ "-webkit-touch-callout": {
+ "syntax": "default | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "default",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout"
+ },
+ "-webkit-user-modify": {
+ "syntax": "read-only | read-write | read-write-plaintext-only",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "WebKit Extensions"
+ ],
+ "initial": "read-only",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard"
+ },
+ "align-content": {
+ "syntax": "normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "multilineFlexContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-content"
+ },
+ "align-items": {
+ "syntax": "normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-items"
+ },
+ "align-self": {
+ "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "auto",
+ "appliesto": "flexItemsGridItemsAndAbsolutelyPositionedBoxes",
+ "computed": "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-self"
+ },
+ "align-tracks": {
+ "syntax": "[ normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "normal",
+ "appliesto": "gridContainersWithMasonryLayoutInTheirBlockAxis",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/align-tracks"
+ },
+ "all": {
+ "syntax": "initial | inherit | unset | revert",
+ "media": "noPracticalMedia",
+ "inherited": false,
+ "animationType": "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection",
+ "percentages": "no",
+ "groups": [
+ "CSS Miscellaneous"
+ ],
+ "initial": "noPracticalInitialValue",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedAppliesToEachProperty",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/all"
+ },
+ "animation": {
+ "syntax": "<single-animation>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": [
+ "animation-name",
+ "animation-duration",
+ "animation-timing-function",
+ "animation-delay",
+ "animation-iteration-count",
+ "animation-direction",
+ "animation-fill-mode",
+ "animation-play-state"
+ ],
+ "appliesto": "allElementsAndPseudos",
+ "computed": [
+ "animation-name",
+ "animation-duration",
+ "animation-timing-function",
+ "animation-delay",
+ "animation-direction",
+ "animation-iteration-count",
+ "animation-fill-mode",
+ "animation-play-state"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation"
+ },
+ "animation-delay": {
+ "syntax": "<time>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "0s",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-delay"
+ },
+ "animation-direction": {
+ "syntax": "<single-animation-direction>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "normal",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-direction"
+ },
+ "animation-duration": {
+ "syntax": "<time>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "0s",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-duration"
+ },
+ "animation-fill-mode": {
+ "syntax": "<single-animation-fill-mode>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode"
+ },
+ "animation-iteration-count": {
+ "syntax": "<single-animation-iteration-count>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "1",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count"
+ },
+ "animation-name": {
+ "syntax": "[ none | <keyframes-name> ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-name"
+ },
+ "animation-play-state": {
+ "syntax": "<single-animation-play-state>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "running",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-play-state"
+ },
+ "animation-timing-function": {
+ "syntax": "<timing-function>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Animations"
+ ],
+ "initial": "ease",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/animation-timing-function"
+ },
+ "appearance": {
+ "syntax": "none | auto | textfield | menulist-button | <compat-auto>",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
+ },
+ "aspect-ratio": {
+ "syntax": "auto | <ratio>",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/aspect-ratio"
+ },
+ "azimuth": {
+ "syntax": "<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards",
+ "media": "aural",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Speech"
+ ],
+ "initial": "center",
+ "appliesto": "allElements",
+ "computed": "normalizedAngle",
+ "order": "orderOfAppearance",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/azimuth"
+ },
+ "backdrop-filter": {
+ "syntax": "none | <filter-function-list>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "filterList",
+ "percentages": "no",
+ "groups": [
+ "Filter Effects"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/backdrop-filter"
+ },
+ "backface-visibility": {
+ "syntax": "visible | hidden",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "visible",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/backface-visibility"
+ },
+ "background": {
+ "syntax": "[ <bg-layer> , ]* <final-bg-layer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "background-color",
+ "background-image",
+ "background-clip",
+ "background-position",
+ "background-size",
+ "background-repeat",
+ "background-attachment"
+ ],
+ "percentages": [
+ "background-position",
+ "background-size"
+ ],
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "background-image",
+ "background-position",
+ "background-size",
+ "background-repeat",
+ "background-origin",
+ "background-clip",
+ "background-attachment",
+ "background-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "background-image",
+ "background-position",
+ "background-size",
+ "background-repeat",
+ "background-origin",
+ "background-clip",
+ "background-attachment",
+ "background-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background"
+ },
+ "background-attachment": {
+ "syntax": "<attachment>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "scroll",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-attachment"
+ },
+ "background-blend-mode": {
+ "syntax": "<blend-mode>#",
+ "media": "none",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Compositing and Blending"
+ ],
+ "initial": "normal",
+ "appliesto": "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-blend-mode"
+ },
+ "background-clip": {
+ "syntax": "<box>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "border-box",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-clip"
+ },
+ "background-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "transparent",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-color"
+ },
+ "background-image": {
+ "syntax": "<bg-image>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedURLsAbsolute",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-image"
+ },
+ "background-origin": {
+ "syntax": "<box>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "padding-box",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-origin"
+ },
+ "background-position": {
+ "syntax": "<bg-position>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "repeatableListOfSimpleListOfLpc",
+ "percentages": "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0% 0%",
+ "appliesto": "allElements",
+ "computed": "listEachItemTwoKeywordsOriginOffsets",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position"
+ },
+ "background-position-x": {
+ "syntax": "[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "left",
+ "appliesto": "allElements",
+ "computed": "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position-x"
+ },
+ "background-position-y": {
+ "syntax": "[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "top",
+ "appliesto": "allElements",
+ "computed": "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-position-y"
+ },
+ "background-repeat": {
+ "syntax": "<repeat-style>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "repeat",
+ "appliesto": "allElements",
+ "computed": "listEachItemHasTwoKeywordsOnePerDimension",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-repeat"
+ },
+ "background-size": {
+ "syntax": "<bg-size>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "repeatableListOfSimpleListOfLpc",
+ "percentages": "relativeToBackgroundPositioningArea",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "auto auto",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/background-size"
+ },
+ "block-overflow": {
+ "syntax": "clip | ellipsis | <string>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "clip",
+ "appliesto": "blockContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "experimental"
+ },
+ "block-size": {
+ "syntax": "<'width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "blockSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsWidthAndHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/block-size"
+ },
+ "border": {
+ "syntax": "<line-width> || <line-style> || <color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-color",
+ "border-style",
+ "border-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-width",
+ "border-style",
+ "border-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-width",
+ "border-style",
+ "border-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border"
+ },
+ "border-block": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block"
+ },
+ "border-block-color": {
+ "syntax": "<'border-top-color'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-color"
+ },
+ "border-block-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-style"
+ },
+ "border-block-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-width"
+ },
+ "border-block-end": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-block-end-color",
+ "border-block-end-style",
+ "border-block-end-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end"
+ },
+ "border-block-end-color": {
+ "syntax": "<'border-top-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-color"
+ },
+ "border-block-end-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-style"
+ },
+ "border-block-end-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-width"
+ },
+ "border-block-start": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-block-start-color",
+ "border-block-start-style",
+ "border-block-start-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-width",
+ "border-style",
+ "color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-width",
+ "border-style",
+ "border-block-start-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start"
+ },
+ "border-block-start-color": {
+ "syntax": "<'border-top-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-color"
+ },
+ "border-block-start-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-style"
+ },
+ "border-block-start-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-width"
+ },
+ "border-bottom": {
+ "syntax": "<line-width> || <line-style> || <color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-bottom-color",
+ "border-bottom-style",
+ "border-bottom-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-bottom-width",
+ "border-bottom-style",
+ "border-bottom-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-bottom-width",
+ "border-bottom-style",
+ "border-bottom-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom"
+ },
+ "border-bottom-color": {
+ "syntax": "<'border-top-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-color"
+ },
+ "border-bottom-left-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius"
+ },
+ "border-bottom-right-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius"
+ },
+ "border-bottom-style": {
+ "syntax": "<line-style>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-style"
+ },
+ "border-bottom-width": {
+ "syntax": "<line-width>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-width"
+ },
+ "border-collapse": {
+ "syntax": "collapse | separate",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "separate",
+ "appliesto": "tableElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-collapse"
+ },
+ "border-color": {
+ "syntax": "<color>{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-bottom-color",
+ "border-left-color",
+ "border-right-color",
+ "border-top-color"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-top-color",
+ "border-right-color",
+ "border-bottom-color",
+ "border-left-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-bottom-color",
+ "border-left-color",
+ "border-right-color",
+ "border-top-color"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-color"
+ },
+ "border-end-end-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius"
+ },
+ "border-end-start-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius"
+ },
+ "border-image": {
+ "syntax": "<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": [
+ "border-image-slice",
+ "border-image-width"
+ ],
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-image-source",
+ "border-image-slice",
+ "border-image-width",
+ "border-image-outset",
+ "border-image-repeat"
+ ],
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": [
+ "border-image-outset",
+ "border-image-repeat",
+ "border-image-slice",
+ "border-image-source",
+ "border-image-width"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image"
+ },
+ "border-image-outset": {
+ "syntax": "[ <length> | <number> ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-outset"
+ },
+ "border-image-repeat": {
+ "syntax": "[ stretch | repeat | round | space ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "stretch",
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-repeat"
+ },
+ "border-image-slice": {
+ "syntax": "<number-percentage>{1,4} && fill?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "referToSizeOfBorderImage",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "100%",
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": "oneToFourPercentagesOrAbsoluteLengthsPlusFill",
+ "order": "percentagesOrLengthsFollowedByFill",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-slice"
+ },
+ "border-image-source": {
+ "syntax": "none | <image>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": "noneOrImageWithAbsoluteURI",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-source"
+ },
+ "border-image-width": {
+ "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "referToWidthOrHeightOfBorderImageArea",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "1",
+ "appliesto": "allElementsExceptTableElementsWhenCollapse",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-image-width"
+ },
+ "border-inline": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline"
+ },
+ "border-inline-end": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-inline-end-color",
+ "border-inline-end-style",
+ "border-inline-end-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-width",
+ "border-style",
+ "color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-width",
+ "border-style",
+ "border-inline-end-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end"
+ },
+ "border-inline-color": {
+ "syntax": "<'border-top-color'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-color"
+ },
+ "border-inline-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-style"
+ },
+ "border-inline-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-width"
+ },
+ "border-inline-end-color": {
+ "syntax": "<'border-top-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color"
+ },
+ "border-inline-end-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style"
+ },
+ "border-inline-end-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width"
+ },
+ "border-inline-start": {
+ "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-inline-start-color",
+ "border-inline-start-style",
+ "border-inline-start-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": [
+ "border-width",
+ "border-style",
+ "color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-width",
+ "border-style",
+ "border-inline-start-color"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start"
+ },
+ "border-inline-start-color": {
+ "syntax": "<'border-top-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color"
+ },
+ "border-inline-start-style": {
+ "syntax": "<'border-top-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style"
+ },
+ "border-inline-start-width": {
+ "syntax": "<'border-top-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width"
+ },
+ "border-left": {
+ "syntax": "<line-width> || <line-style> || <color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-left-color",
+ "border-left-style",
+ "border-left-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-left-width",
+ "border-left-style",
+ "border-left-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-left-width",
+ "border-left-style",
+ "border-left-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left"
+ },
+ "border-left-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-color"
+ },
+ "border-left-style": {
+ "syntax": "<line-style>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-style"
+ },
+ "border-left-width": {
+ "syntax": "<line-width>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-left-width"
+ },
+ "border-radius": {
+ "syntax": "<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-top-left-radius",
+ "border-top-right-radius",
+ "border-bottom-right-radius",
+ "border-bottom-left-radius"
+ ],
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-top-left-radius",
+ "border-top-right-radius",
+ "border-bottom-right-radius",
+ "border-bottom-left-radius"
+ ],
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": [
+ "border-bottom-left-radius",
+ "border-bottom-right-radius",
+ "border-top-left-radius",
+ "border-top-right-radius"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-radius"
+ },
+ "border-right": {
+ "syntax": "<line-width> || <line-style> || <color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-right-color",
+ "border-right-style",
+ "border-right-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-right-width",
+ "border-right-style",
+ "border-right-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-right-width",
+ "border-right-style",
+ "border-right-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right"
+ },
+ "border-right-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-color"
+ },
+ "border-right-style": {
+ "syntax": "<line-style>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-style"
+ },
+ "border-right-width": {
+ "syntax": "<line-width>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOr0IfBorderRightStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-right-width"
+ },
+ "border-spacing": {
+ "syntax": "<length> <length>?",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "0",
+ "appliesto": "tableElements",
+ "computed": "twoAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-spacing"
+ },
+ "border-start-end-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius"
+ },
+ "border-start-start-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius"
+ },
+ "border-style": {
+ "syntax": "<line-style>{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-top-style",
+ "border-right-style",
+ "border-bottom-style",
+ "border-left-style"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-bottom-style",
+ "border-left-style",
+ "border-right-style",
+ "border-top-style"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-style"
+ },
+ "border-top": {
+ "syntax": "<line-width> || <line-style> || <color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-top-color",
+ "border-top-style",
+ "border-top-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-top-width",
+ "border-top-style",
+ "border-top-color"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top"
+ },
+ "border-top-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-color"
+ },
+ "border-top-left-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius"
+ },
+ "border-top-right-radius": {
+ "syntax": "<length-percentage>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfBorderBox",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsUAsNotRequiredWhenCollapse",
+ "computed": "twoAbsoluteLengthOrPercentages",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius"
+ },
+ "border-top-style": {
+ "syntax": "<line-style>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-style"
+ },
+ "border-top-width": {
+ "syntax": "<line-width>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOr0IfBorderTopStyleNoneOrHidden",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-top-width"
+ },
+ "border-width": {
+ "syntax": "<line-width>{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "border-bottom-width",
+ "border-left-width",
+ "border-right-width",
+ "border-top-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": [
+ "border-top-width",
+ "border-right-width",
+ "border-bottom-width",
+ "border-left-width"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "border-bottom-width",
+ "border-left-width",
+ "border-right-width",
+ "border-top-width"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/border-width"
+ },
+ "bottom": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToContainingBlockHeight",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/bottom"
+ },
+ "box-align": {
+ "syntax": "start | center | end | baseline | stretch",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "stretch",
+ "appliesto": "elementsWithDisplayBoxOrInlineBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-align"
+ },
+ "box-decoration-break": {
+ "syntax": "slice | clone",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "slice",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-decoration-break"
+ },
+ "box-direction": {
+ "syntax": "normal | reverse | inherit",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "normal",
+ "appliesto": "elementsWithDisplayBoxOrInlineBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-direction"
+ },
+ "box-flex": {
+ "syntax": "<number>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "0",
+ "appliesto": "directChildrenOfElementsWithDisplayMozBoxMozInlineBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-flex"
+ },
+ "box-flex-group": {
+ "syntax": "<integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "1",
+ "appliesto": "inFlowChildrenOfBoxElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-flex-group"
+ },
+ "box-lines": {
+ "syntax": "single | multiple",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "single",
+ "appliesto": "boxElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-lines"
+ },
+ "box-ordinal-group": {
+ "syntax": "<integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "1",
+ "appliesto": "childrenOfBoxElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group"
+ },
+ "box-orient": {
+ "syntax": "horizontal | vertical | inline-axis | block-axis | inherit",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "inlineAxisHorizontalInXUL",
+ "appliesto": "elementsWithDisplayBoxOrInlineBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-orient"
+ },
+ "box-pack": {
+ "syntax": "start | center | end | justify",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions",
+ "WebKit Extensions"
+ ],
+ "initial": "start",
+ "appliesto": "elementsWithDisplayMozBoxMozInlineBox",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-pack"
+ },
+ "box-shadow": {
+ "syntax": "none | <shadow>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "shadowList",
+ "percentages": "no",
+ "groups": [
+ "CSS Backgrounds and Borders"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthsSpecifiedColorAsSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-shadow"
+ },
+ "box-sizing": {
+ "syntax": "content-box | border-box",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "content-box",
+ "appliesto": "allElementsAcceptingWidthOrHeight",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/box-sizing"
+ },
+ "break-after": {
+ "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "auto",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-after"
+ },
+ "break-before": {
+ "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "auto",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-before"
+ },
+ "break-inside": {
+ "syntax": "auto | avoid | avoid-page | avoid-column | avoid-region",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "auto",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/break-inside"
+ },
+ "caption-side": {
+ "syntax": "top | bottom | block-start | block-end | inline-start | inline-end",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "top",
+ "appliesto": "tableCaptionElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/caption-side"
+ },
+ "caret-color": {
+ "syntax": "auto | <color>",
+ "media": "interactive",
+ "inherited": true,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asAutoOrColor",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/caret-color"
+ },
+ "clear": {
+ "syntax": "none | left | right | both | inline-start | inline-end",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "none",
+ "appliesto": "blockLevelElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clear"
+ },
+ "clip": {
+ "syntax": "<shape> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "rectangle",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "auto",
+ "appliesto": "absolutelyPositionedElements",
+ "computed": "autoOrRectangle",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clip"
+ },
+ "clip-path": {
+ "syntax": "<clip-source> | [ <basic-shape> || <geometry-box> ] | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "basicShapeOtherwiseNo",
+ "percentages": "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedURLsAbsolute",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/clip-path"
+ },
+ "color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Color"
+ ],
+ "initial": "variesFromBrowserToBrowser",
+ "appliesto": "allElements",
+ "computed": "translucentValuesRGBAOtherwiseRGB",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color"
+ },
+ "color-adjust": {
+ "syntax": "economy | exact",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Color"
+ ],
+ "initial": "economy",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color-adjust"
+ },
+ "column-count": {
+ "syntax": "<integer> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "auto",
+ "appliesto": "blockContainersExceptTableWrappers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-count"
+ },
+ "column-fill": {
+ "syntax": "auto | balance | balance-all",
+ "media": "visualInContinuousMediaNoEffectInOverflowColumns",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "balance",
+ "appliesto": "multicolElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-fill"
+ },
+ "column-gap": {
+ "syntax": "normal | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "multiColumnElementsFlexContainersGridContainers",
+ "computed": "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-gap"
+ },
+ "column-rule": {
+ "syntax": "<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "column-rule-color",
+ "column-rule-style",
+ "column-rule-width"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": [
+ "column-rule-width",
+ "column-rule-style",
+ "column-rule-color"
+ ],
+ "appliesto": "multicolElements",
+ "computed": [
+ "column-rule-color",
+ "column-rule-style",
+ "column-rule-width"
+ ],
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule"
+ },
+ "column-rule-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "multicolElements",
+ "computed": "computedColor",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-color"
+ },
+ "column-rule-style": {
+ "syntax": "<'border-style'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "none",
+ "appliesto": "multicolElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-style"
+ },
+ "column-rule-width": {
+ "syntax": "<'border-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "medium",
+ "appliesto": "multicolElements",
+ "computed": "absoluteLength0IfColumnRuleStyleNoneOrHidden",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-width"
+ },
+ "column-span": {
+ "syntax": "none | all",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "none",
+ "appliesto": "inFlowBlockLevelElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-span"
+ },
+ "column-width": {
+ "syntax": "<length> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": "auto",
+ "appliesto": "blockContainersExceptTableWrappers",
+ "computed": "absoluteLengthZeroOrLarger",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-width"
+ },
+ "columns": {
+ "syntax": "<'column-width'> || <'column-count'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "column-width",
+ "column-count"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Columns"
+ ],
+ "initial": [
+ "column-width",
+ "column-count"
+ ],
+ "appliesto": "blockContainersExceptTableWrappers",
+ "computed": [
+ "column-width",
+ "column-count"
+ ],
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/columns"
+ },
+ "contain": {
+ "syntax": "none | strict | content | [ size || layout || style || paint ]",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Containment"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/contain"
+ },
+ "content": {
+ "syntax": "normal | none | [ <content-replacement> | <content-list> ] [/ <string> ]?",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Generated Content"
+ ],
+ "initial": "normal",
+ "appliesto": "beforeAndAfterPseudos",
+ "computed": "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/content"
+ },
+ "counter-increment": {
+ "syntax": "[ <custom-ident> <integer>? ]+ | none",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Counter Styles"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-increment"
+ },
+ "counter-reset": {
+ "syntax": "[ <custom-ident> <integer>? ]+ | none",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Counter Styles"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-reset"
+ },
+ "counter-set": {
+ "syntax": "[ <custom-ident> <integer>? ]+ | none",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Counter Styles"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/counter-set"
+ },
+ "cursor": {
+ "syntax": "[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedURLsAbsolute",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/cursor"
+ },
+ "direction": {
+ "syntax": "ltr | rtl",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Writing Modes"
+ ],
+ "initial": "ltr",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/direction"
+ },
+ "display": {
+ "syntax": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Display"
+ ],
+ "initial": "inline",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display"
+ },
+ "empty-cells": {
+ "syntax": "show | hide",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "show",
+ "appliesto": "tableCellElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/empty-cells"
+ },
+ "filter": {
+ "syntax": "none | <filter-function-list>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "filterList",
+ "percentages": "no",
+ "groups": [
+ "Filter Effects"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/filter"
+ },
+ "flex": {
+ "syntax": "none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "flex-grow",
+ "flex-shrink",
+ "flex-basis"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": [
+ "flex-grow",
+ "flex-shrink",
+ "flex-basis"
+ ],
+ "appliesto": "flexItemsAndInFlowPseudos",
+ "computed": [
+ "flex-grow",
+ "flex-shrink",
+ "flex-basis"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex"
+ },
+ "flex-basis": {
+ "syntax": "content | <'width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToFlexContainersInnerMainSize",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "flexItemsAndInFlowPseudos",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "lengthOrPercentageBeforeKeywordIfBothPresent",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-basis"
+ },
+ "flex-direction": {
+ "syntax": "row | row-reverse | column | column-reverse",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "row",
+ "appliesto": "flexContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-direction"
+ },
+ "flex-flow": {
+ "syntax": "<'flex-direction'> || <'flex-wrap'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": [
+ "flex-direction",
+ "flex-wrap"
+ ],
+ "appliesto": "flexContainers",
+ "computed": [
+ "flex-direction",
+ "flex-wrap"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-flow"
+ },
+ "flex-grow": {
+ "syntax": "<number>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "number",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "0",
+ "appliesto": "flexItemsAndInFlowPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-grow"
+ },
+ "flex-shrink": {
+ "syntax": "<number>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "number",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "1",
+ "appliesto": "flexItemsAndInFlowPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-shrink"
+ },
+ "flex-wrap": {
+ "syntax": "nowrap | wrap | wrap-reverse",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "nowrap",
+ "appliesto": "flexContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex-wrap"
+ },
+ "float": {
+ "syntax": "left | right | none | inline-start | inline-end",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsNoEffectIfDisplayNone",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/float"
+ },
+ "font": {
+ "syntax": "[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar",
+ "media": "visual",
+ "inherited": true,
+ "animationType": [
+ "font-style",
+ "font-variant",
+ "font-weight",
+ "font-stretch",
+ "font-size",
+ "line-height",
+ "font-family"
+ ],
+ "percentages": [
+ "font-size",
+ "line-height"
+ ],
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": [
+ "font-style",
+ "font-variant",
+ "font-weight",
+ "font-stretch",
+ "font-size",
+ "line-height",
+ "font-family"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "font-style",
+ "font-variant",
+ "font-weight",
+ "font-stretch",
+ "font-size",
+ "line-height",
+ "font-family"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font"
+ },
+ "font-family": {
+ "syntax": "[ <family-name> | <generic-family> ]#",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "dependsOnUserAgent",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-family"
+ },
+ "font-feature-settings": {
+ "syntax": "normal | <feature-tag-value>#",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-feature-settings"
+ },
+ "font-kerning": {
+ "syntax": "auto | normal | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-kerning"
+ },
+ "font-language-override": {
+ "syntax": "normal | <string>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-language-override"
+ },
+ "font-optical-sizing": {
+ "syntax": "auto | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing"
+ },
+ "font-variation-settings": {
+ "syntax": "normal | [ <string> <number> ]#",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "transform",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variation-settings"
+ },
+ "font-size": {
+ "syntax": "<absolute-size> | <relative-size> | <length-percentage>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "length",
+ "percentages": "referToParentElementsFontSize",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-size"
+ },
+ "font-size-adjust": {
+ "syntax": "none | <number>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "number",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-size-adjust"
+ },
+ "font-smooth": {
+ "syntax": "auto | never | always | <absolute-size> | <length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-smooth"
+ },
+ "font-stretch": {
+ "syntax": "<font-stretch-absolute>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "fontStretch",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-stretch"
+ },
+ "font-style": {
+ "syntax": "normal | italic | oblique <angle>?",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-style"
+ },
+ "font-synthesis": {
+ "syntax": "none | [ weight || style ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "weight style",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-synthesis"
+ },
+ "font-variant": {
+ "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant"
+ },
+ "font-variant-alternates": {
+ "syntax": "normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates"
+ },
+ "font-variant-caps": {
+ "syntax": "normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-caps"
+ },
+ "font-variant-east-asian": {
+ "syntax": "normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian"
+ },
+ "font-variant-ligatures": {
+ "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures"
+ },
+ "font-variant-numeric": {
+ "syntax": "normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric"
+ },
+ "font-variant-position": {
+ "syntax": "normal | sub | super",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-position"
+ },
+ "font-weight": {
+ "syntax": "<font-weight-absolute> | bolder | lighter",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "fontWeight",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "keywordOrNumericalValueBolderLighterTransformedToRealValue",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/font-weight"
+ },
+ "gap": {
+ "syntax": "<'row-gap'> <'column-gap'>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "row-gap",
+ "column-gap"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": [
+ "row-gap",
+ "column-gap"
+ ],
+ "appliesto": "multiColumnElementsFlexContainersGridContainers",
+ "computed": [
+ "row-gap",
+ "column-gap"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gap"
+ },
+ "grid": {
+ "syntax": "<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": [
+ "grid-template-rows",
+ "grid-template-columns",
+ "grid-auto-rows",
+ "grid-auto-columns"
+ ],
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-template-rows",
+ "grid-template-columns",
+ "grid-template-areas",
+ "grid-auto-rows",
+ "grid-auto-columns",
+ "grid-auto-flow",
+ "grid-column-gap",
+ "grid-row-gap",
+ "column-gap",
+ "row-gap"
+ ],
+ "appliesto": "gridContainers",
+ "computed": [
+ "grid-template-rows",
+ "grid-template-columns",
+ "grid-template-areas",
+ "grid-auto-rows",
+ "grid-auto-columns",
+ "grid-auto-flow",
+ "grid-column-gap",
+ "grid-row-gap",
+ "column-gap",
+ "row-gap"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid"
+ },
+ "grid-area": {
+ "syntax": "<grid-line> [ / <grid-line> ]{0,3}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-row-start",
+ "grid-column-start",
+ "grid-row-end",
+ "grid-column-end"
+ ],
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": [
+ "grid-row-start",
+ "grid-column-start",
+ "grid-row-end",
+ "grid-column-end"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-area"
+ },
+ "grid-auto-columns": {
+ "syntax": "<track-size>+",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridContainers",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns"
+ },
+ "grid-auto-flow": {
+ "syntax": "[ row | column ] || dense",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "row",
+ "appliesto": "gridContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow"
+ },
+ "grid-auto-rows": {
+ "syntax": "<track-size>+",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridContainers",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows"
+ },
+ "grid-column": {
+ "syntax": "<grid-line> [ / <grid-line> ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-column-start",
+ "grid-column-end"
+ ],
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": [
+ "grid-column-start",
+ "grid-column-end"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column"
+ },
+ "grid-column-end": {
+ "syntax": "<grid-line>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-end"
+ },
+ "grid-column-gap": {
+ "syntax": "<length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "0",
+ "appliesto": "gridContainers",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/column-gap"
+ },
+ "grid-column-start": {
+ "syntax": "<grid-line>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-start"
+ },
+ "grid-gap": {
+ "syntax": "<'grid-row-gap'> <'grid-column-gap'>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "grid-row-gap",
+ "grid-column-gap"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-row-gap",
+ "grid-column-gap"
+ ],
+ "appliesto": "gridContainers",
+ "computed": [
+ "grid-row-gap",
+ "grid-column-gap"
+ ],
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gap"
+ },
+ "grid-row": {
+ "syntax": "<grid-line> [ / <grid-line> ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-row-start",
+ "grid-row-end"
+ ],
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": [
+ "grid-row-start",
+ "grid-row-end"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row"
+ },
+ "grid-row-end": {
+ "syntax": "<grid-line>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-end"
+ },
+ "grid-row-gap": {
+ "syntax": "<length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "0",
+ "appliesto": "gridContainers",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/row-gap"
+ },
+ "grid-row-start": {
+ "syntax": "<grid-line>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "auto",
+ "appliesto": "gridItemsAndBoxesWithinGridContainer",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-start"
+ },
+ "grid-template": {
+ "syntax": "none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": [
+ "grid-template-columns",
+ "grid-template-rows"
+ ],
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": [
+ "grid-template-columns",
+ "grid-template-rows",
+ "grid-template-areas"
+ ],
+ "appliesto": "gridContainers",
+ "computed": [
+ "grid-template-columns",
+ "grid-template-rows",
+ "grid-template-areas"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template"
+ },
+ "grid-template-areas": {
+ "syntax": "none | <string>+",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "none",
+ "appliesto": "gridContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-areas"
+ },
+ "grid-template-columns": {
+ "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpcDifferenceLpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "none",
+ "appliesto": "gridContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-columns"
+ },
+ "grid-template-rows": {
+ "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpcDifferenceLpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "none",
+ "appliesto": "gridContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-rows"
+ },
+ "hanging-punctuation": {
+ "syntax": "none | [ first || [ force-end | allow-end ] || last ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation"
+ },
+ "height": {
+ "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsButNonReplacedAndTableColumns",
+ "computed": "percentageAutoOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/height"
+ },
+ "hyphens": {
+ "syntax": "none | manual | auto",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "manual",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/hyphens"
+ },
+ "image-orientation": {
+ "syntax": "from-image | <angle> | [ <angle>? flip ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Images"
+ ],
+ "initial": "from-image",
+ "appliesto": "allElements",
+ "computed": "angleRoundedToNextQuarter",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image-orientation"
+ },
+ "image-rendering": {
+ "syntax": "auto | crisp-edges | pixelated",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Images"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image-rendering"
+ },
+ "image-resolution": {
+ "syntax": "[ from-image || <resolution> ] && snap?",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Images"
+ ],
+ "initial": "1dppx",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedWithExceptionOfResolution",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ },
+ "ime-mode": {
+ "syntax": "auto | normal | active | inactive | disabled",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "textFields",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ime-mode"
+ },
+ "initial-letter": {
+ "syntax": "normal | [ <number> <integer>? ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Inline"
+ ],
+ "initial": "normal",
+ "appliesto": "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter"
+ },
+ "initial-letter-align": {
+ "syntax": "[ auto | alphabetic | hanging | ideographic ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Inline"
+ ],
+ "initial": "auto",
+ "appliesto": "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter-align"
+ },
+ "inline-size": {
+ "syntax": "<'width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "inlineSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsWidthAndHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inline-size"
+ },
+ "inset": {
+ "syntax": "<'top'>{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalHeightOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset"
+ },
+ "inset-block": {
+ "syntax": "<'top'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalHeightOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block"
+ },
+ "inset-block-end": {
+ "syntax": "<'top'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalHeightOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-end"
+ },
+ "inset-block-start": {
+ "syntax": "<'top'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalHeightOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-start"
+ },
+ "inset-inline": {
+ "syntax": "<'top'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline"
+ },
+ "inset-inline-end": {
+ "syntax": "<'top'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-end"
+ },
+ "inset-inline-start": {
+ "syntax": "<'top'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "sameAsBoxOffsets",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-start"
+ },
+ "isolation": {
+ "syntax": "auto | isolate",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Compositing and Blending"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/isolation"
+ },
+ "justify-content": {
+ "syntax": "normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "flexContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-content"
+ },
+ "justify-items": {
+ "syntax": "normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "legacy",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-items"
+ },
+ "justify-self": {
+ "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "auto",
+ "appliesto": "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-self"
+ },
+ "justify-tracks": {
+ "syntax": "[ normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "normal",
+ "appliesto": "gridContainersWithMasonryLayoutInTheirInlineAxis",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/justify-tracks"
+ },
+ "left": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/left"
+ },
+ "letter-spacing": {
+ "syntax": "normal | <length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "optimumValueOfAbsoluteLengthOrNormal",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/letter-spacing"
+ },
+ "line-break": {
+ "syntax": "auto | loose | normal | strict | anywhere",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-break"
+ },
+ "line-clamp": {
+ "syntax": "none | <integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "none",
+ "appliesto": "blockContainersExceptMultiColumnContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "experimental"
+ },
+ "line-height": {
+ "syntax": "normal | <number> | <length> | <percentage>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "numberOrLength",
+ "percentages": "referToElementFontSize",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "absoluteLengthOrAsSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-height"
+ },
+ "line-height-step": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fonts"
+ ],
+ "initial": "0",
+ "appliesto": "blockContainers",
+ "computed": "absoluteLength",
+ "order": "perGrammar",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/line-height-step"
+ },
+ "list-style": {
+ "syntax": "<'list-style-type'> || <'list-style-position'> || <'list-style-image'>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Lists and Counters"
+ ],
+ "initial": [
+ "list-style-type",
+ "list-style-position",
+ "list-style-image"
+ ],
+ "appliesto": "listItems",
+ "computed": [
+ "list-style-image",
+ "list-style-position",
+ "list-style-type"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style"
+ },
+ "list-style-image": {
+ "syntax": "<url> | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Lists and Counters"
+ ],
+ "initial": "none",
+ "appliesto": "listItems",
+ "computed": "noneOrImageWithAbsoluteURI",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-image"
+ },
+ "list-style-position": {
+ "syntax": "inside | outside",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Lists and Counters"
+ ],
+ "initial": "outside",
+ "appliesto": "listItems",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-position"
+ },
+ "list-style-type": {
+ "syntax": "<counter-style> | <string> | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Lists and Counters"
+ ],
+ "initial": "disc",
+ "appliesto": "listItems",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/list-style-type"
+ },
+ "margin": {
+ "syntax": "[ <length> | <percentage> | auto ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": [
+ "margin-bottom",
+ "margin-left",
+ "margin-right",
+ "margin-top"
+ ],
+ "appliesto": "allElementsExceptTableDisplayTypes",
+ "computed": [
+ "margin-bottom",
+ "margin-left",
+ "margin-right",
+ "margin-top"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin"
+ },
+ "margin-block": {
+ "syntax": "<'margin-left'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block"
+ },
+ "margin-block-end": {
+ "syntax": "<'margin-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-end"
+ },
+ "margin-block-start": {
+ "syntax": "<'margin-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-start"
+ },
+ "margin-bottom": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-bottom"
+ },
+ "margin-inline": {
+ "syntax": "<'margin-left'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline"
+ },
+ "margin-inline-end": {
+ "syntax": "<'margin-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-end"
+ },
+ "margin-inline-start": {
+ "syntax": "<'margin-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "dependsOnLayoutModel",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsMargin",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-start"
+ },
+ "margin-left": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-left"
+ },
+ "margin-right": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-right"
+ },
+ "margin-top": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-top"
+ },
+ "margin-trim": {
+ "syntax": "none | in-flow | all",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "none",
+ "appliesto": "blockContainersAndMultiColumnContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/margin-trim"
+ },
+ "mask": {
+ "syntax": "<mask-layer>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "mask-image",
+ "mask-mode",
+ "mask-repeat",
+ "mask-position",
+ "mask-clip",
+ "mask-origin",
+ "mask-size",
+ "mask-composite"
+ ],
+ "percentages": [
+ "mask-position"
+ ],
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": [
+ "mask-image",
+ "mask-mode",
+ "mask-repeat",
+ "mask-position",
+ "mask-clip",
+ "mask-origin",
+ "mask-size",
+ "mask-composite"
+ ],
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": [
+ "mask-image",
+ "mask-mode",
+ "mask-repeat",
+ "mask-position",
+ "mask-clip",
+ "mask-origin",
+ "mask-size",
+ "mask-composite"
+ ],
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask"
+ },
+ "mask-border": {
+ "syntax": "<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "mask-border-mode",
+ "mask-border-outset",
+ "mask-border-repeat",
+ "mask-border-slice",
+ "mask-border-source",
+ "mask-border-width"
+ ],
+ "percentages": [
+ "mask-border-slice",
+ "mask-border-width"
+ ],
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": [
+ "mask-border-mode",
+ "mask-border-outset",
+ "mask-border-repeat",
+ "mask-border-slice",
+ "mask-border-source",
+ "mask-border-width"
+ ],
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": [
+ "mask-border-mode",
+ "mask-border-outset",
+ "mask-border-repeat",
+ "mask-border-slice",
+ "mask-border-source",
+ "mask-border-width"
+ ],
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border"
+ },
+ "mask-border-mode": {
+ "syntax": "luminance | alpha",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "alpha",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-mode"
+ },
+ "mask-border-outset": {
+ "syntax": "[ <length> | <number> ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-outset"
+ },
+ "mask-border-repeat": {
+ "syntax": "[ stretch | repeat | round | space ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "stretch",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat"
+ },
+ "mask-border-slice": {
+ "syntax": "<number-percentage>{1,4} fill?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "referToSizeOfMaskBorderImage",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-slice"
+ },
+ "mask-border-source": {
+ "syntax": "none | <image>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedURLsAbsolute",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-source"
+ },
+ "mask-border-width": {
+ "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "relativeToMaskBorderImageArea",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-border-width"
+ },
+ "mask-clip": {
+ "syntax": "[ <geometry-box> | no-clip ]#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "border-box",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-clip"
+ },
+ "mask-composite": {
+ "syntax": "<compositing-operator>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "add",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-composite"
+ },
+ "mask-image": {
+ "syntax": "<mask-reference>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedURLsAbsolute",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-image"
+ },
+ "mask-mode": {
+ "syntax": "<masking-mode>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "match-source",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-mode"
+ },
+ "mask-origin": {
+ "syntax": "<geometry-box>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "border-box",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-origin"
+ },
+ "mask-position": {
+ "syntax": "<position>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "repeatableListOfSimpleListOfLpc",
+ "percentages": "referToSizeOfMaskPaintingArea",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "center",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "consistsOfTwoKeywordsForOriginAndOffsets",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-position"
+ },
+ "mask-repeat": {
+ "syntax": "<repeat-style>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "no-repeat",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "consistsOfTwoDimensionKeywords",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-repeat"
+ },
+ "mask-size": {
+ "syntax": "<bg-size>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "repeatableListOfSimpleListOfLpc",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsSVGContainerElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-size"
+ },
+ "mask-type": {
+ "syntax": "luminance | alpha",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Masking"
+ ],
+ "initial": "luminance",
+ "appliesto": "maskElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mask-type"
+ },
+ "masonry-auto-flow": {
+ "syntax": "[ pack | next ] || [ definite-first | ordered ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Grid Layout"
+ ],
+ "initial": "pack",
+ "appliesto": "gridContainersWithMasonryLayout",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/masonry-auto-flow"
+ },
+ "math-style": {
+ "syntax": "normal | compact",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "notAnimatable",
+ "percentages": "no",
+ "groups": [
+ "MathML"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/math-style"
+ },
+ "max-block-size": {
+ "syntax": "<'max-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "blockSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsMaxWidthAndMaxHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-block-size"
+ },
+ "max-height": {
+ "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsButNonReplacedAndTableColumns",
+ "computed": "percentageAsSpecifiedAbsoluteLengthOrNone",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-height"
+ },
+ "max-inline-size": {
+ "syntax": "<'max-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "inlineSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsMaxWidthAndMaxHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-inline-size"
+ },
+ "max-lines": {
+ "syntax": "none | <integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "none",
+ "appliesto": "blockContainersExceptMultiColumnContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "experimental"
+ },
+ "max-width": {
+ "syntax": "none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "none",
+ "appliesto": "allElementsButNonReplacedAndTableRows",
+ "computed": "percentageAsSpecifiedAbsoluteLengthOrNone",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/max-width"
+ },
+ "min-block-size": {
+ "syntax": "<'min-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "blockSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsMinWidthAndMinHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-block-size"
+ },
+ "min-height": {
+ "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "regardingHeightOfGeneratedBoxContainingBlockPercentages0",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsButNonReplacedAndTableColumns",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-height"
+ },
+ "min-inline-size": {
+ "syntax": "<'min-width'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "inlineSizeOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "sameAsWidthAndHeight",
+ "computed": "sameAsMinWidthAndMinHeight",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-inline-size"
+ },
+ "min-width": {
+ "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsButNonReplacedAndTableRows",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/min-width"
+ },
+ "mix-blend-mode": {
+ "syntax": "<blend-mode>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Compositing and Blending"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode"
+ },
+ "object-fit": {
+ "syntax": "fill | contain | cover | none | scale-down",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Images"
+ ],
+ "initial": "fill",
+ "appliesto": "replacedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/object-fit"
+ },
+ "object-position": {
+ "syntax": "<position>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "repeatableListOfSimpleListOfLpc",
+ "percentages": "referToWidthAndHeightOfElement",
+ "groups": [
+ "CSS Images"
+ ],
+ "initial": "50% 50%",
+ "appliesto": "replacedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/object-position"
+ },
+ "offset": {
+ "syntax": "[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "offset-position",
+ "offset-path",
+ "offset-distance",
+ "offset-anchor",
+ "offset-rotate"
+ ],
+ "percentages": [
+ "offset-position",
+ "offset-distance",
+ "offset-anchor"
+ ],
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": [
+ "offset-position",
+ "offset-path",
+ "offset-distance",
+ "offset-anchor",
+ "offset-rotate"
+ ],
+ "appliesto": "transformableElements",
+ "computed": [
+ "offset-position",
+ "offset-path",
+ "offset-distance",
+ "offset-anchor",
+ "offset-rotate"
+ ],
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset"
+ },
+ "offset-anchor": {
+ "syntax": "auto | <position>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "position",
+ "percentages": "relativeToWidthAndHeight",
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": "auto",
+ "appliesto": "transformableElements",
+ "computed": "forLengthAbsoluteValueOtherwisePercentage",
+ "order": "perGrammar",
+ "status": "standard"
+ },
+ "offset-distance": {
+ "syntax": "<length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToTotalPathLength",
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": "0",
+ "appliesto": "transformableElements",
+ "computed": "forLengthAbsoluteValueOtherwisePercentage",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-distance"
+ },
+ "offset-path": {
+ "syntax": "none | ray( [ <angle> && <size> && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "angleOrBasicShapeOrPath",
+ "percentages": "no",
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-path"
+ },
+ "offset-position": {
+ "syntax": "auto | <position>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "position",
+ "percentages": "referToSizeOfContainingBlock",
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": "auto",
+ "appliesto": "transformableElements",
+ "computed": "forLengthAbsoluteValueOtherwisePercentage",
+ "order": "perGrammar",
+ "status": "experimental"
+ },
+ "offset-rotate": {
+ "syntax": "[ auto | reverse ] || <angle>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "angleOrBasicShapeOrPath",
+ "percentages": "no",
+ "groups": [
+ "CSS Motion Path"
+ ],
+ "initial": "auto",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/offset-rotate"
+ },
+ "opacity": {
+ "syntax": "<alpha-value>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "number",
+ "percentages": "no",
+ "groups": [
+ "CSS Color"
+ ],
+ "initial": "1.0",
+ "appliesto": "allElements",
+ "computed": "specifiedValueClipped0To1",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/opacity"
+ },
+ "order": {
+ "syntax": "<integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "CSS Flexible Box Layout"
+ ],
+ "initial": "0",
+ "appliesto": "flexItemsGridItemsAbsolutelyPositionedContainerChildren",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/order"
+ },
+ "orphans": {
+ "syntax": "<integer>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "2",
+ "appliesto": "blockContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/orphans"
+ },
+ "outline": {
+ "syntax": "[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": false,
+ "animationType": [
+ "outline-color",
+ "outline-width",
+ "outline-style"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": [
+ "outline-color",
+ "outline-style",
+ "outline-width"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "outline-color",
+ "outline-width",
+ "outline-style"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline"
+ },
+ "outline-color": {
+ "syntax": "<color> | invert",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "invertOrCurrentColor",
+ "appliesto": "allElements",
+ "computed": "invertForTranslucentColorRGBAOtherwiseRGB",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-color"
+ },
+ "outline-offset": {
+ "syntax": "<length>",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-offset"
+ },
+ "outline-style": {
+ "syntax": "auto | <'border-style'>",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-style"
+ },
+ "outline-width": {
+ "syntax": "<line-width>",
+ "media": [
+ "visual",
+ "interactive"
+ ],
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "medium",
+ "appliesto": "allElements",
+ "computed": "absoluteLength0ForNone",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/outline-width"
+ },
+ "overflow": {
+ "syntax": "[ visible | hidden | clip | scroll | auto ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "visible",
+ "appliesto": "blockContainersFlexContainersGridContainers",
+ "computed": [
+ "overflow-x",
+ "overflow-y"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow"
+ },
+ "overflow-anchor": {
+ "syntax": "auto | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Anchoring"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard"
+ },
+ "overflow-block": {
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "auto",
+ "appliesto": "blockContainersFlexContainersGridContainers",
+ "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+ "order": "perGrammar",
+ "status": "standard"
+ },
+ "overflow-clip-box": {
+ "syntax": "padding-box | content-box",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Mozilla Extensions"
+ ],
+ "initial": "padding-box",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Mozilla/CSS/overflow-clip-box"
+ },
+ "overflow-inline": {
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "auto",
+ "appliesto": "blockContainersFlexContainersGridContainers",
+ "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+ "order": "perGrammar",
+ "status": "standard"
+ },
+ "overflow-wrap": {
+ "syntax": "normal | break-word | anywhere",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "nonReplacedInlineElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
+ },
+ "overflow-x": {
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "visible",
+ "appliesto": "blockContainersFlexContainersGridContainers",
+ "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-x"
+ },
+ "overflow-y": {
+ "syntax": "visible | hidden | clip | scroll | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "visible",
+ "appliesto": "blockContainersFlexContainersGridContainers",
+ "computed": "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-y"
+ },
+ "overscroll-behavior": {
+ "syntax": "[ contain | none | auto ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior"
+ },
+ "overscroll-behavior-block": {
+ "syntax": "contain | none | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block"
+ },
+ "overscroll-behavior-inline": {
+ "syntax": "contain | none | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline"
+ },
+ "overscroll-behavior-x": {
+ "syntax": "contain | none | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x"
+ },
+ "overscroll-behavior-y": {
+ "syntax": "contain | none | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "nonReplacedBlockAndInlineBlockElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y"
+ },
+ "padding": {
+ "syntax": "[ <length> | <percentage> ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": [
+ "padding-bottom",
+ "padding-left",
+ "padding-right",
+ "padding-top"
+ ],
+ "appliesto": "allElementsExceptInternalTableDisplayTypes",
+ "computed": [
+ "padding-bottom",
+ "padding-left",
+ "padding-right",
+ "padding-top"
+ ],
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding"
+ },
+ "padding-block": {
+ "syntax": "<'padding-left'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block"
+ },
+ "padding-block-end": {
+ "syntax": "<'padding-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-end"
+ },
+ "padding-block-start": {
+ "syntax": "<'padding-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-start"
+ },
+ "padding-bottom": {
+ "syntax": "<length> | <percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptInternalTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-bottom"
+ },
+ "padding-inline": {
+ "syntax": "<'padding-left'>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline"
+ },
+ "padding-inline-end": {
+ "syntax": "<'padding-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-end"
+ },
+ "padding-inline-start": {
+ "syntax": "<'padding-left'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "logicalWidthOfContainingBlock",
+ "groups": [
+ "CSS Logical Properties"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-start"
+ },
+ "padding-left": {
+ "syntax": "<length> | <percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptInternalTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-left"
+ },
+ "padding-right": {
+ "syntax": "<length> | <percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptInternalTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-right"
+ },
+ "padding-top": {
+ "syntax": "<length> | <percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "0",
+ "appliesto": "allElementsExceptInternalTableDisplayTypes",
+ "computed": "percentageAsSpecifiedOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/padding-top"
+ },
+ "page-break-after": {
+ "syntax": "auto | always | avoid | left | right | recto | verso",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Pages"
+ ],
+ "initial": "auto",
+ "appliesto": "blockElementsInNormalFlow",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-after"
+ },
+ "page-break-before": {
+ "syntax": "auto | always | avoid | left | right | recto | verso",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Pages"
+ ],
+ "initial": "auto",
+ "appliesto": "blockElementsInNormalFlow",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-before"
+ },
+ "page-break-inside": {
+ "syntax": "auto | avoid",
+ "media": [
+ "visual",
+ "paged"
+ ],
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Pages"
+ ],
+ "initial": "auto",
+ "appliesto": "blockElementsInNormalFlow",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/page-break-inside"
+ },
+ "paint-order": {
+ "syntax": "normal | [ fill || stroke || markers ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "textElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/paint-order"
+ },
+ "perspective": {
+ "syntax": "none | <length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "absoluteLengthOrNone",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/perspective"
+ },
+ "perspective-origin": {
+ "syntax": "<position>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpc",
+ "percentages": "referToSizeOfBoundingBox",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "50% 50%",
+ "appliesto": "transformableElements",
+ "computed": "forLengthAbsoluteValueOtherwisePercentage",
+ "order": "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/perspective-origin"
+ },
+ "place-content": {
+ "syntax": "<'align-content'> <'justify-content'>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "multilineFlexContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-content"
+ },
+ "place-items": {
+ "syntax": "<'align-items'> <'justify-items'>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": [
+ "align-items",
+ "justify-items"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "align-items",
+ "justify-items"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-items"
+ },
+ "place-self": {
+ "syntax": "<'align-self'> <'justify-self'>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": [
+ "align-self",
+ "justify-self"
+ ],
+ "appliesto": "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+ "computed": [
+ "align-self",
+ "justify-self"
+ ],
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/place-self"
+ },
+ "pointer-events": {
+ "syntax": "auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Pointer Events"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/pointer-events"
+ },
+ "position": {
+ "syntax": "static | relative | absolute | sticky | fixed",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "static",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/position"
+ },
+ "quotes": {
+ "syntax": "none | auto | [ <string> <string> ]+",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Generated Content"
+ ],
+ "initial": "dependsOnUserAgent",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/quotes"
+ },
+ "resize": {
+ "syntax": "none | both | horizontal | vertical | block | inline",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "none",
+ "appliesto": "elementsWithOverflowNotVisibleAndReplacedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/resize"
+ },
+ "right": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/right"
+ },
+ "rotate": {
+ "syntax": "none | <angle> | [ x | y | z | <number>{3} ] && <angle>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "transform",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/rotate"
+ },
+ "row-gap": {
+ "syntax": "normal | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToDimensionOfContentArea",
+ "groups": [
+ "CSS Box Alignment"
+ ],
+ "initial": "normal",
+ "appliesto": "multiColumnElementsFlexContainersGridContainers",
+ "computed": "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/row-gap"
+ },
+ "ruby-align": {
+ "syntax": "start | center | space-between | space-around",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Ruby"
+ ],
+ "initial": "space-around",
+ "appliesto": "rubyBasesAnnotationsBaseAnnotationContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ruby-align"
+ },
+ "ruby-merge": {
+ "syntax": "separate | collapse | auto",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Ruby"
+ ],
+ "initial": "separate",
+ "appliesto": "rubyAnnotationsContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental"
+ },
+ "ruby-position": {
+ "syntax": "over | under | inter-character",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Ruby"
+ ],
+ "initial": "over",
+ "appliesto": "rubyAnnotationsContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ruby-position"
+ },
+ "scale": {
+ "syntax": "none | <number>{1,3}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "transform",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scale"
+ },
+ "scrollbar-color": {
+ "syntax": "auto | dark | light | <color>{2}",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Scrollbars"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollingBoxes",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-color"
+ },
+ "scrollbar-gutter": {
+ "syntax": "auto | [ stable | always ] && both? && force?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Overflow"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter"
+ },
+ "scrollbar-width": {
+ "syntax": "auto | thin | none",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scrollbars"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollingBoxes",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-width"
+ },
+ "scroll-behavior": {
+ "syntax": "auto | smooth",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSSOM View"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollingBoxes",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-behavior"
+ },
+ "scroll-margin": {
+ "syntax": "<length>{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin"
+ },
+ "scroll-margin-block": {
+ "syntax": "<length>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block"
+ },
+ "scroll-margin-block-start": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start"
+ },
+ "scroll-margin-block-end": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end"
+ },
+ "scroll-margin-bottom": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom"
+ },
+ "scroll-margin-inline": {
+ "syntax": "<length>{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline"
+ },
+ "scroll-margin-inline-start": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start"
+ },
+ "scroll-margin-inline-end": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end"
+ },
+ "scroll-margin-left": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left"
+ },
+ "scroll-margin-right": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right"
+ },
+ "scroll-margin-top": {
+ "syntax": "<length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top"
+ },
+ "scroll-padding": {
+ "syntax": "[ auto | <length-percentage> ]{1,4}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding"
+ },
+ "scroll-padding-block": {
+ "syntax": "[ auto | <length-percentage> ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block"
+ },
+ "scroll-padding-block-start": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start"
+ },
+ "scroll-padding-block-end": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end"
+ },
+ "scroll-padding-bottom": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom"
+ },
+ "scroll-padding-inline": {
+ "syntax": "[ auto | <length-percentage> ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline"
+ },
+ "scroll-padding-inline-start": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start"
+ },
+ "scroll-padding-inline-end": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end"
+ },
+ "scroll-padding-left": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left"
+ },
+ "scroll-padding-right": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right"
+ },
+ "scroll-padding-top": {
+ "syntax": "auto | <length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "relativeToTheScrollContainersScrollport",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "auto",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top"
+ },
+ "scroll-snap-align": {
+ "syntax": "[ none | start | end | center ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align"
+ },
+ "scroll-snap-coordinate": {
+ "syntax": "none | <position>#",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "position",
+ "percentages": "referToBorderBox",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate"
+ },
+ "scroll-snap-destination": {
+ "syntax": "<position>",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "position",
+ "percentages": "relativeToScrollContainerPaddingBoxAxis",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "0px 0px",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination"
+ },
+ "scroll-snap-points-x": {
+ "syntax": "none | repeat( <length-percentage> )",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "relativeToScrollContainerPaddingBoxAxis",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x"
+ },
+ "scroll-snap-points-y": {
+ "syntax": "none | repeat( <length-percentage> )",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "relativeToScrollContainerPaddingBoxAxis",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y"
+ },
+ "scroll-snap-stop": {
+ "syntax": "normal | always",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop"
+ },
+ "scroll-snap-type": {
+ "syntax": "none | [ x | y | block | inline | both ] [ mandatory | proximity ]?",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type"
+ },
+ "scroll-snap-type-x": {
+ "syntax": "none | mandatory | proximity",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x"
+ },
+ "scroll-snap-type-y": {
+ "syntax": "none | mandatory | proximity",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Scroll Snap"
+ ],
+ "initial": "none",
+ "appliesto": "scrollContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "obsolete",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y"
+ },
+ "shape-image-threshold": {
+ "syntax": "<alpha-value>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "number",
+ "percentages": "no",
+ "groups": [
+ "CSS Shapes"
+ ],
+ "initial": "0.0",
+ "appliesto": "floats",
+ "computed": "specifiedValueNumberClipped0To1",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold"
+ },
+ "shape-margin": {
+ "syntax": "<length-percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Shapes"
+ ],
+ "initial": "0",
+ "appliesto": "floats",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-margin"
+ },
+ "shape-outside": {
+ "syntax": "none | <shape-box> || <basic-shape> | <image>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "basicShapeOtherwiseNo",
+ "percentages": "no",
+ "groups": [
+ "CSS Shapes"
+ ],
+ "initial": "none",
+ "appliesto": "floats",
+ "computed": "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape-outside"
+ },
+ "tab-size": {
+ "syntax": "<integer> | <length>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "length",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "8",
+ "appliesto": "blockContainers",
+ "computed": "specifiedIntegerOrAbsoluteLength",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/tab-size"
+ },
+ "table-layout": {
+ "syntax": "auto | fixed",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "auto",
+ "appliesto": "tableElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/table-layout"
+ },
+ "text-align": {
+ "syntax": "start | end | left | right | center | justify | match-parent",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "startOrNamelessValueIfLTRRightIfRTL",
+ "appliesto": "blockContainers",
+ "computed": "asSpecifiedExceptMatchParent",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-align"
+ },
+ "text-align-last": {
+ "syntax": "auto | start | end | left | right | center | justify",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "auto",
+ "appliesto": "blockContainers",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-align-last"
+ },
+ "text-combine-upright": {
+ "syntax": "none | all | [ digits <integer>? ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "notAnimatable",
+ "percentages": "no",
+ "groups": [
+ "CSS Writing Modes"
+ ],
+ "initial": "none",
+ "appliesto": "nonReplacedInlineElements",
+ "computed": "keywordPlusIntegerIfDigits",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-combine-upright"
+ },
+ "text-decoration": {
+ "syntax": "<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "text-decoration-color",
+ "text-decoration-style",
+ "text-decoration-line",
+ "text-decoration-thickness"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": [
+ "text-decoration-color",
+ "text-decoration-style",
+ "text-decoration-line"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "text-decoration-line",
+ "text-decoration-style",
+ "text-decoration-color",
+ "text-decoration-thickness"
+ ],
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration"
+ },
+ "text-decoration-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-color"
+ },
+ "text-decoration-line": {
+ "syntax": "none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-line"
+ },
+ "text-decoration-skip": {
+ "syntax": "none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "objects",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip"
+ },
+ "text-decoration-skip-ink": {
+ "syntax": "auto | all | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink"
+ },
+ "text-decoration-style": {
+ "syntax": "solid | double | dotted | dashed | wavy",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "solid",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-style"
+ },
+ "text-decoration-thickness": {
+ "syntax": "auto | from-font | <length> | <percentage> ",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "byComputedValueType",
+ "percentages": "referToElementFontSize",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness"
+ },
+ "text-emphasis": {
+ "syntax": "<'text-emphasis-style'> || <'text-emphasis-color'>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": [
+ "text-emphasis-color",
+ "text-emphasis-style"
+ ],
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": [
+ "text-emphasis-style",
+ "text-emphasis-color"
+ ],
+ "appliesto": "allElements",
+ "computed": [
+ "text-emphasis-style",
+ "text-emphasis-color"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis"
+ },
+ "text-emphasis-color": {
+ "syntax": "<color>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "color",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "currentcolor",
+ "appliesto": "allElements",
+ "computed": "computedColor",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color"
+ },
+ "text-emphasis-position": {
+ "syntax": "[ over | under ] && [ right | left ]",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "over right",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position"
+ },
+ "text-emphasis-style": {
+ "syntax": "none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style"
+ },
+ "text-indent": {
+ "syntax": "<length-percentage> && hanging? && each-line?",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "0",
+ "appliesto": "blockContainers",
+ "computed": "percentageOrAbsoluteLengthPlusKeywords",
+ "order": "lengthOrPercentageBeforeKeywords",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-indent"
+ },
+ "text-justify": {
+ "syntax": "auto | inter-character | inter-word | none",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "auto",
+ "appliesto": "inlineLevelAndTableCellElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-justify"
+ },
+ "text-orientation": {
+ "syntax": "mixed | upright | sideways",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Writing Modes"
+ ],
+ "initial": "mixed",
+ "appliesto": "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-orientation"
+ },
+ "text-overflow": {
+ "syntax": "[ clip | ellipsis | <string> ]{1,2}",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "clip",
+ "appliesto": "blockContainerElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-overflow"
+ },
+ "text-rendering": {
+ "syntax": "auto | optimizeSpeed | optimizeLegibility | geometricPrecision",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Miscellaneous"
+ ],
+ "initial": "auto",
+ "appliesto": "textElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-rendering"
+ },
+ "text-shadow": {
+ "syntax": "none | <shadow-t>#",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "shadowList",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "colorPlusThreeAbsoluteLengths",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-shadow"
+ },
+ "text-size-adjust": {
+ "syntax": "none | auto | <percentage>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "referToSizeOfFont",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "autoForSmartphoneBrowsersSupportingInflation",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-size-adjust"
+ },
+ "text-transform": {
+ "syntax": "none | capitalize | uppercase | lowercase | full-width | full-size-kana",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "none",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-transform"
+ },
+ "text-underline-offset": {
+ "syntax": "auto | <length> | <percentage> ",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "byComputedValueType",
+ "percentages": "referToElementFontSize",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-offset"
+ },
+ "text-underline-position": {
+ "syntax": "auto | from-font | [ under || [ left | right ] ]",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text Decoration"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-position"
+ },
+ "top": {
+ "syntax": "<length> | <percentage> | auto",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToContainingBlockHeight",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/top"
+ },
+ "touch-action": {
+ "syntax": "auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "Pointer Events"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/touch-action"
+ },
+ "transform": {
+ "syntax": "none | <transform-list>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "transform",
+ "percentages": "referToSizeOfBoundingBox",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform"
+ },
+ "transform-box": {
+ "syntax": "content-box | border-box | fill-box | stroke-box | view-box",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "view-box",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-box"
+ },
+ "transform-origin": {
+ "syntax": "[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "simpleListOfLpc",
+ "percentages": "referToSizeOfBoundingBox",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "50% 50% 0",
+ "appliesto": "transformableElements",
+ "computed": "forLengthAbsoluteValueOtherwisePercentage",
+ "order": "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-origin"
+ },
+ "transform-style": {
+ "syntax": "flat | preserve-3d",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "flat",
+ "appliesto": "transformableElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-style"
+ },
+ "transition": {
+ "syntax": "<single-transition>#",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transitions"
+ ],
+ "initial": [
+ "transition-delay",
+ "transition-duration",
+ "transition-property",
+ "transition-timing-function"
+ ],
+ "appliesto": "allElementsAndPseudos",
+ "computed": [
+ "transition-delay",
+ "transition-duration",
+ "transition-property",
+ "transition-timing-function"
+ ],
+ "order": "orderOfAppearance",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition"
+ },
+ "transition-delay": {
+ "syntax": "<time>#",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transitions"
+ ],
+ "initial": "0s",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-delay"
+ },
+ "transition-duration": {
+ "syntax": "<time>#",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transitions"
+ ],
+ "initial": "0s",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-duration"
+ },
+ "transition-property": {
+ "syntax": "none | <single-transition-property>#",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transitions"
+ ],
+ "initial": "all",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-property"
+ },
+ "transition-timing-function": {
+ "syntax": "<timing-function>#",
+ "media": "interactive",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Transitions"
+ ],
+ "initial": "ease",
+ "appliesto": "allElementsAndPseudos",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transition-timing-function"
+ },
+ "translate": {
+ "syntax": "none | <length-percentage> [ <length-percentage> <length>? ]?",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "transform",
+ "percentages": "referToSizeOfBoundingBox",
+ "groups": [
+ "CSS Transforms"
+ ],
+ "initial": "none",
+ "appliesto": "transformableElements",
+ "computed": "asSpecifiedRelativeToAbsoluteLengths",
+ "order": "perGrammar",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/translate"
+ },
+ "unicode-bidi": {
+ "syntax": "normal | embed | isolate | bidi-override | isolate-override | plaintext",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Writing Modes"
+ ],
+ "initial": "normal",
+ "appliesto": "allElementsSomeValuesNoEffectOnNonInlineElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/unicode-bidi"
+ },
+ "user-select": {
+ "syntax": "auto | text | none | contain | all",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Basic User Interface"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/user-select"
+ },
+ "vertical-align": {
+ "syntax": "baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "length",
+ "percentages": "referToLineHeight",
+ "groups": [
+ "CSS Table"
+ ],
+ "initial": "baseline",
+ "appliesto": "inlineLevelAndTableCellElements",
+ "computed": "absoluteLengthOrKeyword",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/vertical-align"
+ },
+ "visibility": {
+ "syntax": "visible | hidden | collapse",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "visibility",
+ "percentages": "no",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "visible",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/visibility"
+ },
+ "white-space": {
+ "syntax": "normal | pre | nowrap | pre-wrap | pre-line | break-spaces",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/white-space"
+ },
+ "widows": {
+ "syntax": "<integer>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Fragmentation"
+ ],
+ "initial": "2",
+ "appliesto": "blockContainerElements",
+ "computed": "asSpecified",
+ "order": "perGrammar",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/widows"
+ },
+ "width": {
+ "syntax": "auto | <length> | <percentage> | min-content | max-content | fit-content(<length-percentage>)",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "lpc",
+ "percentages": "referToWidthOfContainingBlock",
+ "groups": [
+ "CSS Box Model"
+ ],
+ "initial": "auto",
+ "appliesto": "allElementsButNonReplacedAndTableRows",
+ "computed": "percentageAutoOrAbsoluteLength",
+ "order": "lengthOrPercentageBeforeKeywordIfBothPresent",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/width"
+ },
+ "will-change": {
+ "syntax": "auto | <animateable-feature>#",
+ "media": "all",
+ "inherited": false,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Will Change"
+ ],
+ "initial": "auto",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/will-change"
+ },
+ "word-break": {
+ "syntax": "normal | break-all | keep-all | break-word",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/word-break"
+ },
+ "word-spacing": {
+ "syntax": "normal | <length-percentage>",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "length",
+ "percentages": "referToWidthOfAffectedGlyph",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal",
+ "order": "uniqueOrder",
+ "alsoAppliesTo": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/word-spacing"
+ },
+ "word-wrap": {
+ "syntax": "normal | break-word",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Text"
+ ],
+ "initial": "normal",
+ "appliesto": "nonReplacedInlineElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
+ },
+ "writing-mode": {
+ "syntax": "horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr",
+ "media": "visual",
+ "inherited": true,
+ "animationType": "discrete",
+ "percentages": "no",
+ "groups": [
+ "CSS Writing Modes"
+ ],
+ "initial": "horizontal-tb",
+ "appliesto": "allElementsExceptTableRowColumnGroupsTableRowsColumns",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/writing-mode"
+ },
+ "z-index": {
+ "syntax": "auto | <integer>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "CSS Positioning"
+ ],
+ "initial": "auto",
+ "appliesto": "positionedElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "stacking": true,
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/z-index"
+ },
+ "zoom": {
+ "syntax": "normal | reset | <number> | <percentage>",
+ "media": "visual",
+ "inherited": false,
+ "animationType": "integer",
+ "percentages": "no",
+ "groups": [
+ "Microsoft Extensions"
+ ],
+ "initial": "normal",
+ "appliesto": "allElements",
+ "computed": "asSpecified",
+ "order": "uniqueOrder",
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/zoom"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/properties.schema.json b/node_modules/csso/node_modules/mdn-data/css/properties.schema.json
new file mode 100644
index 0000000..d4883e2
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/properties.schema.json
@@ -0,0 +1,402 @@
+{
+ "definitions": {
+ "propertyList": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "property-reference": {
+ "comment": "property-reference is an extension to the JSON schema validator. Here it jumps to the root level of the hierarchy and tests if a value is an existing key there (i.e a defined property). See test/validate-schema.js for implementation details.",
+ "$data": "/"
+ }
+ }
+ },
+ "animationType": {
+ "enum": [
+ "angleBasicShapeOrPath",
+ "angleOrBasicShapeOrPath",
+ "basicShapeOtherwiseNo",
+ "byComputedValueType",
+ "color",
+ "discrete",
+ "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection",
+ "filterList",
+ "fontStretch",
+ "fontWeight",
+ "integer",
+ "length",
+ "lpc",
+ "notAnimatable",
+ "numberOrLength",
+ "number",
+ "position",
+ "rectangle",
+ "repeatableListOfSimpleListOfLpc",
+ "shadowList",
+ "simpleListOfLpc",
+ "simpleListOfLpcDifferenceLpc",
+ "transform",
+ "visibility"
+ ]
+ },
+ "percentages": {
+ "enum": [
+ "blockSizeOfContainingBlock",
+ "dependsOnLayoutModel",
+ "inlineSizeOfContainingBlock",
+ "lengthsAsPercentages",
+ "logicalHeightOfContainingBlock",
+ "logicalWidthOfContainingBlock",
+ "maxZoomFactor",
+ "minZoomFactor",
+ "no",
+ "referToBorderBox",
+ "referToContainingBlockHeight",
+ "referToDimensionOfBorderBox",
+ "referToDimensionOfContentArea",
+ "referToElementFontSize",
+ "referToFlexContainersInnerMainSize",
+ "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+ "referToLineBoxWidth",
+ "referToLineHeight",
+ "referToParentElementsFontSize",
+ "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize",
+ "referToSizeOfBorderImage",
+ "referToSizeOfBoundingBox",
+ "referToSizeOfContainingBlock",
+ "referToSizeOfElement",
+ "referToSizeOfFont",
+ "referToSizeOfMaskBorderImage",
+ "referToSizeOfMaskPaintingArea",
+ "referToTotalPathLength",
+ "referToWidthAndHeightOfElement",
+ "referToWidthOfAffectedGlyph",
+ "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight",
+ "referToWidthOfContainingBlock",
+ "referToWidthOrHeightOfBorderImageArea",
+ "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox",
+ "regardingHeightOfGeneratedBoxContainingBlockPercentages0",
+ "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone",
+ "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock",
+ "relativeToBackgroundPositioningArea",
+ "relativeToMaskBorderImageArea",
+ "relativeToScrollContainerPaddingBoxAxis",
+ "relativeToTheScrollContainersScrollport",
+ "relativeToWidthAndHeight"
+ ]
+ },
+ "computed": {
+ "enum": [
+ "absoluteLength",
+ "absoluteLength0ForNone",
+ "absoluteLength0IfColumnRuleStyleNoneOrHidden",
+ "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden",
+ "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden",
+ "absoluteLengthOr0IfBorderRightStyleNoneOrHidden",
+ "absoluteLengthOr0IfBorderTopStyleNoneOrHidden",
+ "absoluteLengthOrAsSpecified",
+ "absoluteLengthOrKeyword",
+ "absoluteLengthOrNone",
+ "absoluteLengthOrNormal",
+ "absoluteLengthOrPercentage",
+ "absoluteLengthsSpecifiedColorAsSpecified",
+ "absoluteLengthZeroIfBorderStyleNoneOrHidden",
+ "absoluteLengthZeroOrLarger",
+ "absoluteURIOrNone",
+ "angleRoundedToNextQuarter",
+ "asAutoOrColor",
+ "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified",
+ "asLength",
+ "asSpecified",
+ "asSpecifiedAppliesToEachProperty",
+ "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent",
+ "asSpecifiedExceptMatchParent",
+ "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent",
+ "asSpecifiedRelativeToAbsoluteLengths",
+ "asSpecifiedURLsAbsolute",
+ "asSpecifiedWithExceptionOfResolution",
+ "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn",
+ "asSpecifiedWithVarsSubstituted",
+ "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent",
+ "autoOrRectangle",
+ "colorPlusThreeAbsoluteLengths",
+ "computedColor",
+ "consistsOfTwoDimensionKeywords",
+ "consistsOfTwoKeywordsForOriginAndOffsets",
+ "forLengthAbsoluteValueOtherwisePercentage",
+ "invertForTranslucentColorRGBAOtherwiseRGB",
+ "keywordOrNumericalValueBolderLighterTransformedToRealValue",
+ "keywordPlusIntegerIfDigits",
+ "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto",
+ "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin",
+ "listEachItemHasTwoKeywordsOnePerDimension",
+ "listEachItemTwoKeywordsOriginOffsets",
+ "noneOrImageWithAbsoluteURI",
+ "normalizedAngle",
+ "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified",
+ "oneToFourPercentagesOrAbsoluteLengthsPlusFill",
+ "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal",
+ "optimumValueOfAbsoluteLengthOrNormal",
+ "percentageAsSpecifiedAbsoluteLengthOrNone",
+ "percentageAsSpecifiedOrAbsoluteLength",
+ "percentageAutoOrAbsoluteLength",
+ "percentageOrAbsoluteLengthPlusKeywords",
+ "sameAsBoxOffsets",
+ "sameAsMaxWidthAndMaxHeight",
+ "sameAsMinWidthAndMinHeight",
+ "sameAsWidthAndHeight",
+ "specifiedIntegerOrAbsoluteLength",
+ "specifiedValueClipped0To1",
+ "specifiedValueNumberClipped0To1",
+ "translucentValuesRGBAOtherwiseRGB",
+ "twoAbsoluteLengthOrPercentages",
+ "twoAbsoluteLengths"
+ ]
+ },
+ "appliesto": {
+ "enum": [
+ "absolutelyPositionedElements",
+ "allElements",
+ "allElementsAcceptingWidthOrHeight",
+ "allElementsAndPseudos",
+ "allElementsButNonReplacedAndTableColumns",
+ "allElementsButNonReplacedAndTableRows",
+ "allElementsCreatingNativeWindows",
+ "allElementsExceptGeneratedContentOrPseudoElements",
+ "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes",
+ "allElementsExceptInternalTableDisplayTypes",
+ "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups",
+ "allElementsExceptTableDisplayTypes",
+ "allElementsExceptTableElementsWhenCollapse",
+ "allElementsExceptTableRowColumnGroupsTableRowsColumns",
+ "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns",
+ "allElementsNoEffectIfDisplayNone",
+ "allElementsSomeValuesNoEffectOnNonInlineElements",
+ "allElementsSVGContainerElements",
+ "allElementsSVGContainerGraphicsAndGraphicsReferencingElements",
+ "allElementsThatCanReferenceImages",
+ "allElementsUAsNotRequiredWhenCollapse",
+ "anyElementEffectOnProgressAndMeter",
+ "beforeAndAfterPseudos",
+ "blockContainerElements",
+ "blockContainers",
+ "blockContainersAndMultiColumnContainers",
+ "blockContainersExceptMultiColumnContainers",
+ "blockContainersExceptTableWrappers",
+ "blockContainersFlexContainersGridContainers",
+ "blockElementsInNormalFlow",
+ "blockLevelElements",
+ "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems",
+ "boxElements",
+ "childrenOfBoxElements",
+ "directChildrenOfElementsWithDisplayMozBoxMozInlineBox",
+ "elementsWithDisplayBoxOrInlineBox",
+ "elementsWithDisplayMarker",
+ "elementsWithDisplayMozBoxMozInlineBox",
+ "elementsWithOverflowNotVisibleAndReplacedElements",
+ "exclusionElements",
+ "firstLetterPseudoElementsAndInlineLevelFirstChildren",
+ "flexContainers",
+ "flexItemsAndAbsolutelyPositionedFlexContainerChildren",
+ "flexItemsAndInFlowPseudos",
+ "flexItemsGridItemsAbsolutelyPositionedContainerChildren",
+ "flexItemsGridItemsAndAbsolutelyPositionedBoxes",
+ "floats",
+ "gridContainers",
+ "gridContainersWithMasonryLayout",
+ "gridContainersWithMasonryLayoutInTheirBlockAxis",
+ "gridContainersWithMasonryLayoutInTheirInlineAxis",
+ "gridItemsAndBoxesWithinGridContainer",
+ "iframeElements",
+ "images",
+ "inFlowBlockLevelElements",
+ "inFlowChildrenOfBoxElements",
+ "inlineLevelAndTableCellElements",
+ "listItems",
+ "maskElements",
+ "multicolElements",
+ "multiColumnElementsFlexContainersGridContainers",
+ "multilineFlexContainers",
+ "nonReplacedBlockAndInlineBlockElements",
+ "nonReplacedBlockElements",
+ "nonReplacedElements",
+ "nonReplacedInlineElements",
+ "positionedElements",
+ "replacedElements",
+ "rubyAnnotationsContainers",
+ "rubyBasesAnnotationsBaseAnnotationContainers",
+ "sameAsMargin",
+ "sameAsWidthAndHeight",
+ "scrollContainers",
+ "scrollingBoxes",
+ "tableCaptionElements",
+ "tableCellElements",
+ "tableElements",
+ "textElements",
+ "textFields",
+ "transformableElements",
+ "xulImageElements"
+ ]
+ },
+ "alsoApplyTo": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "::first-letter",
+ "::first-line",
+ "::placeholder"
+ ]
+ }
+ },
+ "order": {
+ "enum": [
+ "canonicalOrder",
+ "lengthOrPercentageBeforeKeywordIfBothPresent",
+ "lengthOrPercentageBeforeKeywords",
+ "oneOrTwoValuesLengthAbsoluteKeywordsPercentages",
+ "orderOfAppearance",
+ "percentagesOrLengthsFollowedByFill",
+ "perGrammar",
+ "uniqueOrder"
+ ]
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental",
+ "obsolete"
+ ]
+ },
+ "mdn_url": {
+ "type": "string",
+ "pattern": "^https://developer.mozilla.org/docs/"
+ }
+ },
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "syntax",
+ "media",
+ "inherited",
+ "animationType",
+ "percentages",
+ "groups",
+ "initial",
+ "appliesto",
+ "computed",
+ "order",
+ "status"
+ ],
+ "properties": {
+ "syntax": {
+ "type": "string"
+ },
+ "media": {
+ "oneOf": [
+ {
+ "type": "string",
+ "enum": [
+ "all",
+ "aural",
+ "continuous",
+ "interactive",
+ "none",
+ "noPracticalMedia",
+ "paged",
+ "visual",
+ "visualInContinuousMediaNoEffectInOverflowColumns"
+ ]
+ },
+ {
+ "type": "array",
+ "minItems": 2,
+ "uniqueItems": true,
+ "items": {
+ "type": "string",
+ "enum": [
+ "interactive",
+ "paged",
+ "visual"
+ ]
+ }
+ }
+ ]
+ },
+ "inherited": {
+ "type": "boolean"
+ },
+ "animationType": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/animationType"
+ },
+ {
+ "$ref": "#/definitions/propertyList"
+ }
+ ]
+ },
+ "percentages": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/percentages"
+ },
+ {
+ "$ref": "#/definitions/propertyList"
+ }
+ ]
+ },
+ "groups": {
+ "type": "array",
+ "minitems": 1,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "definitions.json#/groupList"
+ }
+ },
+ "initial": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/definitions/propertyList"
+ }
+ ]
+ },
+ "appliesto": {
+ "$ref": "#/definitions/appliesto"
+ },
+ "alsoAppliesTo": {
+ "$ref": "#/definitions/alsoApplyTo"
+ },
+ "computed": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/computed"
+ },
+ {
+ "$ref": "#/definitions/propertyList"
+ }
+ ]
+ },
+ "order": {
+ "$ref": "#/definitions/order"
+ },
+ "stacking": {
+ "type": "boolean"
+ },
+ "status": {
+ "$ref": "#/definitions/status"
+ },
+ "mdn_url": {
+ "$ref": "#/definitions/mdn_url"
+ }
+ }
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/selectors.json b/node_modules/csso/node_modules/mdn-data/css/selectors.json
new file mode 100644
index 0000000..84a63c1
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/selectors.json
@@ -0,0 +1,927 @@
+{
+ "Type selectors": {
+ "syntax": "element",
+ "groups": [
+ "Basic Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Type_selectors"
+ },
+ "Class selectors": {
+ "syntax": ".class",
+ "groups": [
+ "Basic Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Class_selectors"
+ },
+ "ID selectors": {
+ "syntax": "#id",
+ "groups": [
+ "Basic Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ID_selectors"
+ },
+ "Universal selectors": {
+ "syntax": "*",
+ "groups": [
+ "Basic Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Universal_selectors"
+ },
+ "Attribute selectors": {
+ "syntax": "[attr=value]",
+ "groups": [
+ "Basic Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Attribute_selectors"
+ },
+ "Selector list": {
+ "syntax": ",",
+ "groups": [
+ "Grouping Selectors",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Selector_list"
+ },
+ "Adjacent sibling combinator": {
+ "syntax": "A + B",
+ "groups": [
+ "Combinators",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Adjacent_sibling_combinator"
+ },
+ "General sibling combinator": {
+ "syntax": "A ~ B",
+ "groups": [
+ "Combinators",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/General_sibling_combinator"
+ },
+ "Child combinator": {
+ "syntax": "A > B",
+ "groups": [
+ "Combinators",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Child_combinator"
+ },
+ "Descendant combinator": {
+ "syntax": "A B",
+ "groups": [
+ "Combinators",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Descendant_combinator"
+ },
+ "Column combinator": {
+ "syntax": "A || B",
+ "groups": [
+ "Combinators",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Column_combinator"
+ },
+ "Pseudo-classes": {
+ "syntax": ":",
+ "groups": [
+ "Pseudo",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Pseudo-classes"
+ },
+ "Pseudo-elements": {
+ "syntax": "::",
+ "groups": [
+ "Pseudo",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/Pseudo-elements"
+ },
+ ":active": {
+ "syntax": ":active",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:active"
+ },
+ ":any-link": {
+ "syntax": ":any-link",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:any-link"
+ },
+ ":checked": {
+ "syntax": ":checked",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:checked"
+ },
+ ":blank": {
+ "syntax": ":blank",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:blank"
+ },
+ ":default": {
+ "syntax": ":default",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:default"
+ },
+ ":defined": {
+ "syntax": ":defined",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:defined"
+ },
+ ":dir": {
+ "syntax": ":dir( ltr | rtl )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:dir"
+ },
+ ":disabled": {
+ "syntax": ":disabled",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:disabled"
+ },
+ ":empty": {
+ "syntax": ":empty",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:empty"
+ },
+ ":enabled": {
+ "syntax": ":enabled",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:enabled"
+ },
+ ":first": {
+ "syntax": ":first",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first"
+ },
+ ":first-child": {
+ "syntax": ":first-child",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first-child"
+ },
+ ":first-of-type": {
+ "syntax": ":first-of-type",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:first-of-type"
+ },
+ ":fullscreen": {
+ "syntax": ":fullscreen",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:fullscreen"
+ },
+ ":focus": {
+ "syntax": ":focus",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus"
+ },
+ ":focus-visible": {
+ "syntax": ":focus-visible",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus-visible"
+ },
+ ":focus-within": {
+ "syntax": ":focus-within",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:focus-within"
+ },
+ ":has": {
+ "syntax": ":has( <relative-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:has"
+ },
+ ":host()": {
+ "syntax": ":host( <compound-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:host()"
+ },
+ ":host-context()": {
+ "syntax": ":host-context( <compound-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:host-context()"
+ },
+ ":hover": {
+ "syntax": ":hover",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:hover"
+ },
+ ":indeterminate": {
+ "syntax": ":indeterminate",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:indeterminate"
+ },
+ ":in-range": {
+ "syntax": ":in-range",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:in-range"
+ },
+ ":invalid": {
+ "syntax": ":invalid",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:invalid"
+ },
+ ":is": {
+ "syntax": ":is( <complex-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:is"
+ },
+ ":lang": {
+ "syntax": ":lang( <language-code> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:lang"
+ },
+ ":last-child": {
+ "syntax": ":last-child",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:last-child"
+ },
+ ":last-of-type": {
+ "syntax": ":last-of-type",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:last-of-type"
+ },
+ ":left": {
+ "syntax": ":left",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors",
+ "CSS Pages"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:left"
+ },
+ ":link": {
+ "syntax": ":link",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:link"
+ },
+ ":not": {
+ "syntax": ":not( <complex-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:not"
+ },
+ ":nth-child": {
+ "syntax": ":nth-child( <nth> [ of <complex-selector-list> ]? )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-child"
+ },
+ ":nth-last-child": {
+ "syntax": ":nth-last-child( <nth> [ of <complex-selector-list> ]? )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-last-child"
+ },
+ ":nth-last-of-type": {
+ "syntax": ":nth-last-of-type( <nth> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-last-of-type"
+ },
+ ":nth-of-type": {
+ "syntax": ":nth-of-type( <nth> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:nth-of-type"
+ },
+ ":only-child": {
+ "syntax": ":only-child",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:only-child"
+ },
+ ":only-of-type": {
+ "syntax": ":only-of-type",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:only-of-type"
+ },
+ ":optional": {
+ "syntax": ":optional",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:optional"
+ },
+ ":out-of-range": {
+ "syntax": ":out-of-range",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:out-of-range"
+ },
+ ":placeholder-shown": {
+ "syntax": ":placeholder-shown",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown"
+ },
+ ":read-only": {
+ "syntax": ":read-only",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:read-only"
+ },
+ ":read-write": {
+ "syntax": ":read-write",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:read-write"
+ },
+ ":required": {
+ "syntax": ":required",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:required"
+ },
+ ":right": {
+ "syntax": ":right",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors",
+ "CSS Pages"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:right"
+ },
+ ":root": {
+ "syntax": ":root",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors",
+ "CSS Pages"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:root"
+ },
+ ":scope": {
+ "syntax": ":scope",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:scope"
+ },
+ ":target": {
+ "syntax": ":target",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:target"
+ },
+ ":valid": {
+ "syntax": ":valid",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:valid"
+ },
+ ":visited": {
+ "syntax": ":visited",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:visited"
+ },
+ ":where": {
+ "syntax": ":where( <complex-selector-list> )",
+ "groups": [
+ "Pseudo-classes",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/:where"
+ },
+ "::-moz-progress-bar": {
+ "syntax": "::-moz-progress-bar",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Mozilla Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-progress-bar"
+ },
+ "::-moz-range-progress": {
+ "syntax": "::-moz-range-progress",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Mozilla Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress"
+ },
+ "::-moz-range-thumb": {
+ "syntax": "::-moz-range-thumb",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Mozilla Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb"
+ },
+ "::-moz-range-track": {
+ "syntax": "::-moz-range-track",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Mozilla Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track"
+ },
+ "::-ms-browse": {
+ "syntax": "::-ms-browse",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-browse"
+ },
+ "::-ms-check": {
+ "syntax": "::-ms-check",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-check"
+ },
+ "::-ms-clear": {
+ "syntax": "::-ms-clear",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-clear"
+ },
+ "::-ms-expand": {
+ "syntax": "::-ms-clear",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-expand"
+ },
+ "::-ms-fill": {
+ "syntax": "::-ms-fill",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill"
+ },
+ "::-ms-fill-lower": {
+ "syntax": "::-ms-fill-lower",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill-lower"
+ },
+ "::-ms-fill-upper": {
+ "syntax": "::-ms-fill-upper",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-fill-upper"
+ },
+ "::-ms-reveal": {
+ "syntax": "::-ms-reveal",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-reveal"
+ },
+ "::-ms-thumb": {
+ "syntax": "::-ms-thumb",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-thumb"
+ },
+ "::-ms-ticks-after": {
+ "syntax": "::-ms-ticks-after",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-ticks-after"
+ },
+ "::-ms-ticks-before": {
+ "syntax": "::-ms-ticks-before",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-ticks-before"
+ },
+ "::-ms-tooltip": {
+ "syntax": "::-ms-tooltip",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-tooltip"
+ },
+ "::-ms-track": {
+ "syntax": "::-ms-track",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-track"
+ },
+ "::-ms-value": {
+ "syntax": "::-ms-value",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "Microsoft Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-ms-value"
+ },
+ "::-webkit-progress-bar": {
+ "syntax": "::-webkit-progress-bar",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar"
+ },
+ "::-webkit-progress-inner-value": {
+ "syntax": "::-webkit-progress-inner-value",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ],
+ "status": "nonstandard"
+ },
+ "::-webkit-progress-value": {
+ "syntax": "::-webkit-progress-value",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value"
+ },
+ "::-webkit-slider-runnable-track": {
+ "syntax": "::-webkit-slider-runnable-track",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-slider-runnable-track"
+ },
+ "::-webkit-slider-thumb": {
+ "syntax": "::-webkit-slider-thumb",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors",
+ "WebKit Extensions"
+ ],
+ "status": "nonstandard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-slider-thumb"
+ },
+ "::after": {
+ "syntax": "/* CSS3 syntax */\n::after\n\n/* CSS2 syntax */\n:after",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::after"
+ },
+ "::backdrop": {
+ "syntax": "::backdrop",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::backdrop"
+ },
+ "::before": {
+ "syntax": "/* CSS3 syntax */\n::before\n\n/* CSS2 syntax */\n:before",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::before"
+ },
+ "::cue": {
+ "syntax": "::cue | ::cue( <selector> )",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::cue"
+ },
+ "::cue-region": {
+ "syntax": "::cue-region | ::cue-region( <selector> )",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::cue-region"
+ },
+ "::first-letter": {
+ "syntax": "/* CSS3 syntax */\n::first-letter\n\n/* CSS2 syntax */\n:first-letter",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::first-letter"
+ },
+ "::first-line": {
+ "syntax": "/* CSS3 syntax */\n::first-line\n\n/* CSS2 syntax */\n:first-line",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::first-line"
+ },
+ "::grammar-error": {
+ "syntax": "::grammar-error",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::grammar-error"
+ },
+ "::marker": {
+ "syntax": "::marker",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::marker"
+ },
+ "::part": {
+ "syntax": "::part( <ident>+ )",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::part"
+ },
+ "::placeholder": {
+ "syntax": "::placeholder",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::placeholder"
+ },
+ "::selection": {
+ "syntax": "::selection",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::selection"
+ },
+ "::slotted": {
+ "syntax": "::slotted( <compound-selector-list> )",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::slotted"
+ },
+ "::spelling-error": {
+ "syntax": "::spelling-error",
+ "groups": [
+ "Pseudo-elements",
+ "Selectors"
+ ],
+ "status": "experimental",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/::spelling-error"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/selectors.schema.json b/node_modules/csso/node_modules/mdn-data/css/selectors.schema.json
new file mode 100644
index 0000000..67978ce
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/selectors.schema.json
@@ -0,0 +1,36 @@
+{
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "syntax": {
+ "type": "string"
+ },
+ "groups": {
+ "type": "array",
+ "minitems": 1,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "definitions.json#/groupList"
+ }
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental"
+ ]
+ },
+ "mdn_url": {
+ "type": "string",
+ "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+ }
+ },
+ "required": [
+ "syntax",
+ "groups",
+ "status"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/syntaxes.json b/node_modules/csso/node_modules/mdn-data/css/syntaxes.json
new file mode 100644
index 0000000..3d13036
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/syntaxes.json
@@ -0,0 +1,761 @@
+{
+ "absolute-size": {
+ "syntax": "xx-small | x-small | small | medium | large | x-large | xx-large | xxx-large"
+ },
+ "alpha-value": {
+ "syntax": "<number> | <percentage>"
+ },
+ "angle-percentage": {
+ "syntax": "<angle> | <percentage>"
+ },
+ "angular-color-hint": {
+ "syntax": "<angle-percentage>"
+ },
+ "angular-color-stop": {
+ "syntax": "<color> && <color-stop-angle>?"
+ },
+ "angular-color-stop-list": {
+ "syntax": "[ <angular-color-stop> [, <angular-color-hint>]? ]# , <angular-color-stop>"
+ },
+ "animateable-feature": {
+ "syntax": "scroll-position | contents | <custom-ident>"
+ },
+ "attachment": {
+ "syntax": "scroll | fixed | local"
+ },
+ "attr()": {
+ "syntax": "attr( <attr-name> <type-or-unit>? [, <attr-fallback> ]? )"
+ },
+ "attr-matcher": {
+ "syntax": "[ '~' | '|' | '^' | '$' | '*' ]? '='"
+ },
+ "attr-modifier": {
+ "syntax": "i | s"
+ },
+ "attribute-selector": {
+ "syntax": "'[' <wq-name> ']' | '[' <wq-name> <attr-matcher> [ <string-token> | <ident-token> ] <attr-modifier>? ']'"
+ },
+ "auto-repeat": {
+ "syntax": "repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )"
+ },
+ "auto-track-list": {
+ "syntax": "[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat>\n[ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?"
+ },
+ "baseline-position": {
+ "syntax": "[ first | last ]? baseline"
+ },
+ "basic-shape": {
+ "syntax": "<inset()> | <circle()> | <ellipse()> | <polygon()> | <path()>"
+ },
+ "bg-image": {
+ "syntax": "none | <image>"
+ },
+ "bg-layer": {
+ "syntax": "<bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>"
+ },
+ "bg-position": {
+ "syntax": "[ [ left | center | right | top | bottom | <length-percentage> ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ] | [ center | [ left | right ] <length-percentage>? ] && [ center | [ top | bottom ] <length-percentage>? ] ]"
+ },
+ "bg-size": {
+ "syntax": "[ <length-percentage> | auto ]{1,2} | cover | contain"
+ },
+ "blur()": {
+ "syntax": "blur( <length> )"
+ },
+ "blend-mode": {
+ "syntax": "normal | multiply | screen | overlay | darken | lighten | color-dodge | color-burn | hard-light | soft-light | difference | exclusion | hue | saturation | color | luminosity"
+ },
+ "box": {
+ "syntax": "border-box | padding-box | content-box"
+ },
+ "brightness()": {
+ "syntax": "brightness( <number-percentage> )"
+ },
+ "calc()": {
+ "syntax": "calc( <calc-sum> )"
+ },
+ "calc-sum": {
+ "syntax": "<calc-product> [ [ '+' | '-' ] <calc-product> ]*"
+ },
+ "calc-product": {
+ "syntax": "<calc-value> [ '*' <calc-value> | '/' <number> ]*"
+ },
+ "calc-value": {
+ "syntax": "<number> | <dimension> | <percentage> | ( <calc-sum> )"
+ },
+ "cf-final-image": {
+ "syntax": "<image> | <color>"
+ },
+ "cf-mixing-image": {
+ "syntax": "<percentage>? && <image>"
+ },
+ "circle()": {
+ "syntax": "circle( [ <shape-radius> ]? [ at <position> ]? )"
+ },
+ "clamp()": {
+ "syntax": "clamp( <calc-sum>#{3} )"
+ },
+ "class-selector": {
+ "syntax": "'.' <ident-token>"
+ },
+ "clip-source": {
+ "syntax": "<url>"
+ },
+ "color": {
+ "syntax": "<rgb()> | <rgba()> | <hsl()> | <hsla()> | <hex-color> | <named-color> | currentcolor | <deprecated-system-color>"
+ },
+ "color-stop": {
+ "syntax": "<color-stop-length> | <color-stop-angle>"
+ },
+ "color-stop-angle": {
+ "syntax": "<angle-percentage>{1,2}"
+ },
+ "color-stop-length": {
+ "syntax": "<length-percentage>{1,2}"
+ },
+ "color-stop-list": {
+ "syntax": "[ <linear-color-stop> [, <linear-color-hint>]? ]# , <linear-color-stop>"
+ },
+ "combinator": {
+ "syntax": "'>' | '+' | '~' | [ '||' ]"
+ },
+ "common-lig-values": {
+ "syntax": "[ common-ligatures | no-common-ligatures ]"
+ },
+ "compat-auto": {
+ "syntax": "searchfield | textarea | push-button | slider-horizontal | checkbox | radio | square-button | menulist | listbox | meter | progress-bar | button"
+ },
+ "composite-style": {
+ "syntax": "clear | copy | source-over | source-in | source-out | source-atop | destination-over | destination-in | destination-out | destination-atop | xor"
+ },
+ "compositing-operator": {
+ "syntax": "add | subtract | intersect | exclude"
+ },
+ "compound-selector": {
+ "syntax": "[ <type-selector>? <subclass-selector>* [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!"
+ },
+ "compound-selector-list": {
+ "syntax": "<compound-selector>#"
+ },
+ "complex-selector": {
+ "syntax": "<compound-selector> [ <combinator>? <compound-selector> ]*"
+ },
+ "complex-selector-list": {
+ "syntax": "<complex-selector>#"
+ },
+ "conic-gradient()": {
+ "syntax": "conic-gradient( [ from <angle> ]? [ at <position> ]?, <angular-color-stop-list> )"
+ },
+ "contextual-alt-values": {
+ "syntax": "[ contextual | no-contextual ]"
+ },
+ "content-distribution": {
+ "syntax": "space-between | space-around | space-evenly | stretch"
+ },
+ "content-list": {
+ "syntax": "[ <string> | contents | <image> | <quote> | <target> | <leader()> ]+"
+ },
+ "content-position": {
+ "syntax": "center | start | end | flex-start | flex-end"
+ },
+ "content-replacement": {
+ "syntax": "<image>"
+ },
+ "contrast()": {
+ "syntax": "contrast( [ <number-percentage> ] )"
+ },
+ "counter()": {
+ "syntax": "counter( <custom-ident>, <counter-style>? )"
+ },
+ "counter-style": {
+ "syntax": "<counter-style-name> | symbols()"
+ },
+ "counter-style-name": {
+ "syntax": "<custom-ident>"
+ },
+ "counters()": {
+ "syntax": "counters( <custom-ident>, <string>, <counter-style>? )"
+ },
+ "cross-fade()": {
+ "syntax": "cross-fade( <cf-mixing-image> , <cf-final-image>? )"
+ },
+ "cubic-bezier-timing-function": {
+ "syntax": "ease | ease-in | ease-out | ease-in-out | cubic-bezier(<number [0,1]>, <number>, <number [0,1]>, <number>)"
+ },
+ "deprecated-system-color": {
+ "syntax": "ActiveBorder | ActiveCaption | AppWorkspace | Background | ButtonFace | ButtonHighlight | ButtonShadow | ButtonText | CaptionText | GrayText | Highlight | HighlightText | InactiveBorder | InactiveCaption | InactiveCaptionText | InfoBackground | InfoText | Menu | MenuText | Scrollbar | ThreeDDarkShadow | ThreeDFace | ThreeDHighlight | ThreeDLightShadow | ThreeDShadow | Window | WindowFrame | WindowText"
+ },
+ "discretionary-lig-values": {
+ "syntax": "[ discretionary-ligatures | no-discretionary-ligatures ]"
+ },
+ "display-box": {
+ "syntax": "contents | none"
+ },
+ "display-inside": {
+ "syntax": "flow | flow-root | table | flex | grid | ruby"
+ },
+ "display-internal": {
+ "syntax": "table-row-group | table-header-group | table-footer-group | table-row | table-cell | table-column-group | table-column | table-caption | ruby-base | ruby-text | ruby-base-container | ruby-text-container"
+ },
+ "display-legacy": {
+ "syntax": "inline-block | inline-list-item | inline-table | inline-flex | inline-grid"
+ },
+ "display-listitem": {
+ "syntax": "<display-outside>? && [ flow | flow-root ]? && list-item"
+ },
+ "display-outside": {
+ "syntax": "block | inline | run-in"
+ },
+ "drop-shadow()": {
+ "syntax": "drop-shadow( <length>{2,3} <color>? )"
+ },
+ "east-asian-variant-values": {
+ "syntax": "[ jis78 | jis83 | jis90 | jis04 | simplified | traditional ]"
+ },
+ "east-asian-width-values": {
+ "syntax": "[ full-width | proportional-width ]"
+ },
+ "element()": {
+ "syntax": "element( <id-selector> )"
+ },
+ "ellipse()": {
+ "syntax": "ellipse( [ <shape-radius>{2} ]? [ at <position> ]? )"
+ },
+ "ending-shape": {
+ "syntax": "circle | ellipse"
+ },
+ "env()": {
+ "syntax": "env( <custom-ident> , <declaration-value>? )"
+ },
+ "explicit-track-list": {
+ "syntax": "[ <line-names>? <track-size> ]+ <line-names>?"
+ },
+ "family-name": {
+ "syntax": "<string> | <custom-ident>+"
+ },
+ "feature-tag-value": {
+ "syntax": "<string> [ <integer> | on | off ]?"
+ },
+ "feature-type": {
+ "syntax": "@stylistic | @historical-forms | @styleset | @character-variant | @swash | @ornaments | @annotation"
+ },
+ "feature-value-block": {
+ "syntax": "<feature-type> '{' <feature-value-declaration-list> '}'"
+ },
+ "feature-value-block-list": {
+ "syntax": "<feature-value-block>+"
+ },
+ "feature-value-declaration": {
+ "syntax": "<custom-ident>: <integer>+;"
+ },
+ "feature-value-declaration-list": {
+ "syntax": "<feature-value-declaration>"
+ },
+ "feature-value-name": {
+ "syntax": "<custom-ident>"
+ },
+ "fill-rule": {
+ "syntax": "nonzero | evenodd"
+ },
+ "filter-function": {
+ "syntax": "<blur()> | <brightness()> | <contrast()> | <drop-shadow()> | <grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <saturate()> | <sepia()>"
+ },
+ "filter-function-list": {
+ "syntax": "[ <filter-function> | <url> ]+"
+ },
+ "final-bg-layer": {
+ "syntax": "<'background-color'> || <bg-image> || <bg-position> [ / <bg-size> ]? || <repeat-style> || <attachment> || <box> || <box>"
+ },
+ "fit-content()": {
+ "syntax": "fit-content( [ <length> | <percentage> ] )"
+ },
+ "fixed-breadth": {
+ "syntax": "<length-percentage>"
+ },
+ "fixed-repeat": {
+ "syntax": "repeat( [ <positive-integer> ] , [ <line-names>? <fixed-size> ]+ <line-names>? )"
+ },
+ "fixed-size": {
+ "syntax": "<fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )"
+ },
+ "font-stretch-absolute": {
+ "syntax": "normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | <percentage>"
+ },
+ "font-variant-css21": {
+ "syntax": "[ normal | small-caps ]"
+ },
+ "font-weight-absolute": {
+ "syntax": "normal | bold | <number [1,1000]>"
+ },
+ "frequency-percentage": {
+ "syntax": "<frequency> | <percentage>"
+ },
+ "general-enclosed": {
+ "syntax": "[ <function-token> <any-value> ) ] | ( <ident> <any-value> )"
+ },
+ "generic-family": {
+ "syntax": "serif | sans-serif | cursive | fantasy | monospace"
+ },
+ "generic-name": {
+ "syntax": "serif | sans-serif | cursive | fantasy | monospace"
+ },
+ "geometry-box": {
+ "syntax": "<shape-box> | fill-box | stroke-box | view-box"
+ },
+ "gradient": {
+ "syntax": "<linear-gradient()> | <repeating-linear-gradient()> | <radial-gradient()> | <repeating-radial-gradient()> | <conic-gradient()>"
+ },
+ "grayscale()": {
+ "syntax": "grayscale( <number-percentage> )"
+ },
+ "grid-line": {
+ "syntax": "auto | <custom-ident> | [ <integer> && <custom-ident>? ] | [ span && [ <integer> || <custom-ident> ] ]"
+ },
+ "historical-lig-values": {
+ "syntax": "[ historical-ligatures | no-historical-ligatures ]"
+ },
+ "hsl()": {
+ "syntax": "hsl( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsl( <hue>, <percentage>, <percentage>, <alpha-value>? )"
+ },
+ "hsla()": {
+ "syntax": "hsla( <hue> <percentage> <percentage> [ / <alpha-value> ]? ) | hsla( <hue>, <percentage>, <percentage>, <alpha-value>? )"
+ },
+ "hue": {
+ "syntax": "<number> | <angle>"
+ },
+ "hue-rotate()": {
+ "syntax": "hue-rotate( <angle> )"
+ },
+ "id-selector": {
+ "syntax": "<hash-token>"
+ },
+ "image": {
+ "syntax": "<url> | <image()> | <image-set()> | <element()> | <paint()> | <cross-fade()> | <gradient>"
+ },
+ "image()": {
+ "syntax": "image( <image-tags>? [ <image-src>? , <color>? ]! )"
+ },
+ "image-set()": {
+ "syntax": "image-set( <image-set-option># )"
+ },
+ "image-set-option": {
+ "syntax": "[ <image> | <string> ] <resolution>"
+ },
+ "image-src": {
+ "syntax": "<url> | <string>"
+ },
+ "image-tags": {
+ "syntax": "ltr | rtl"
+ },
+ "inflexible-breadth": {
+ "syntax": "<length> | <percentage> | min-content | max-content | auto"
+ },
+ "inset()": {
+ "syntax": "inset( <length-percentage>{1,4} [ round <'border-radius'> ]? )"
+ },
+ "invert()": {
+ "syntax": "invert( <number-percentage> )"
+ },
+ "keyframes-name": {
+ "syntax": "<custom-ident> | <string>"
+ },
+ "keyframe-block": {
+ "syntax": "<keyframe-selector># {\n <declaration-list>\n}"
+ },
+ "keyframe-block-list": {
+ "syntax": "<keyframe-block>+"
+ },
+ "keyframe-selector": {
+ "syntax": "from | to | <percentage>"
+ },
+ "leader()": {
+ "syntax": "leader( <leader-type> )"
+ },
+ "leader-type": {
+ "syntax": "dotted | solid | space | <string>"
+ },
+ "length-percentage": {
+ "syntax": "<length> | <percentage>"
+ },
+ "line-names": {
+ "syntax": "'[' <custom-ident>* ']'"
+ },
+ "line-name-list": {
+ "syntax": "[ <line-names> | <name-repeat> ]+"
+ },
+ "line-style": {
+ "syntax": "none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset"
+ },
+ "line-width": {
+ "syntax": "<length> | thin | medium | thick"
+ },
+ "linear-color-hint": {
+ "syntax": "<length-percentage>"
+ },
+ "linear-color-stop": {
+ "syntax": "<color> <color-stop-length>?"
+ },
+ "linear-gradient()": {
+ "syntax": "linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )"
+ },
+ "mask-layer": {
+ "syntax": "<mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || <geometry-box> || [ <geometry-box> | no-clip ] || <compositing-operator> || <masking-mode>"
+ },
+ "mask-position": {
+ "syntax": "[ <length-percentage> | left | center | right ] [ <length-percentage> | top | center | bottom ]?"
+ },
+ "mask-reference": {
+ "syntax": "none | <image> | <mask-source>"
+ },
+ "mask-source": {
+ "syntax": "<url>"
+ },
+ "masking-mode": {
+ "syntax": "alpha | luminance | match-source"
+ },
+ "matrix()": {
+ "syntax": "matrix( <number>#{6} )"
+ },
+ "matrix3d()": {
+ "syntax": "matrix3d( <number>#{16} )"
+ },
+ "max()": {
+ "syntax": "max( <calc-sum># )"
+ },
+ "media-and": {
+ "syntax": "<media-in-parens> [ and <media-in-parens> ]+"
+ },
+ "media-condition": {
+ "syntax": "<media-not> | <media-and> | <media-or> | <media-in-parens>"
+ },
+ "media-condition-without-or": {
+ "syntax": "<media-not> | <media-and> | <media-in-parens>"
+ },
+ "media-feature": {
+ "syntax": "( [ <mf-plain> | <mf-boolean> | <mf-range> ] )"
+ },
+ "media-in-parens": {
+ "syntax": "( <media-condition> ) | <media-feature> | <general-enclosed>"
+ },
+ "media-not": {
+ "syntax": "not <media-in-parens>"
+ },
+ "media-or": {
+ "syntax": "<media-in-parens> [ or <media-in-parens> ]+"
+ },
+ "media-query": {
+ "syntax": "<media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?"
+ },
+ "media-query-list": {
+ "syntax": "<media-query>#"
+ },
+ "media-type": {
+ "syntax": "<ident>"
+ },
+ "mf-boolean": {
+ "syntax": "<mf-name>"
+ },
+ "mf-name": {
+ "syntax": "<ident>"
+ },
+ "mf-plain": {
+ "syntax": "<mf-name> : <mf-value>"
+ },
+ "mf-range": {
+ "syntax": "<mf-name> [ '<' | '>' ]? '='? <mf-value>\n| <mf-value> [ '<' | '>' ]? '='? <mf-name>\n| <mf-value> '<' '='? <mf-name> '<' '='? <mf-value>\n| <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>"
+ },
+ "mf-value": {
+ "syntax": "<number> | <dimension> | <ident> | <ratio>"
+ },
+ "min()": {
+ "syntax": "min( <calc-sum># )"
+ },
+ "minmax()": {
+ "syntax": "minmax( [ <length> | <percentage> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )"
+ },
+ "named-color": {
+ "syntax": "transparent | aliceblue | antiquewhite | aqua | aquamarine | azure | beige | bisque | black | blanchedalmond | blue | blueviolet | brown | burlywood | cadetblue | chartreuse | chocolate | coral | cornflowerblue | cornsilk | crimson | cyan | darkblue | darkcyan | darkgoldenrod | darkgray | darkgreen | darkgrey | darkkhaki | darkmagenta | darkolivegreen | darkorange | darkorchid | darkred | darksalmon | darkseagreen | darkslateblue | darkslategray | darkslategrey | darkturquoise | darkviolet | deeppink | deepskyblue | dimgray | dimgrey | dodgerblue | firebrick | floralwhite | forestgreen | fuchsia | gainsboro | ghostwhite | gold | goldenrod | gray | green | greenyellow | grey | honeydew | hotpink | indianred | indigo | ivory | khaki | lavender | lavenderblush | lawngreen | lemonchiffon | lightblue | lightcoral | lightcyan | lightgoldenrodyellow | lightgray | lightgreen | lightgrey | lightpink | lightsalmon | lightseagreen | lightskyblue | lightslategray | lightslategrey | lightsteelblue | lightyellow | lime | limegreen | linen | magenta | maroon | mediumaquamarine | mediumblue | mediumorchid | mediumpurple | mediumseagreen | mediumslateblue | mediumspringgreen | mediumturquoise | mediumvioletred | midnightblue | mintcream | mistyrose | moccasin | navajowhite | navy | oldlace | olive | olivedrab | orange | orangered | orchid | palegoldenrod | palegreen | paleturquoise | palevioletred | papayawhip | peachpuff | peru | pink | plum | powderblue | purple | rebeccapurple | red | rosybrown | royalblue | saddlebrown | salmon | sandybrown | seagreen | seashell | sienna | silver | skyblue | slateblue | slategray | slategrey | snow | springgreen | steelblue | tan | teal | thistle | tomato | turquoise | violet | wheat | white | whitesmoke | yellow | yellowgreen"
+ },
+ "namespace-prefix": {
+ "syntax": "<ident>"
+ },
+ "ns-prefix": {
+ "syntax": "[ <ident-token> | '*' ]? '|'"
+ },
+ "number-percentage": {
+ "syntax": "<number> | <percentage>"
+ },
+ "numeric-figure-values": {
+ "syntax": "[ lining-nums | oldstyle-nums ]"
+ },
+ "numeric-fraction-values": {
+ "syntax": "[ diagonal-fractions | stacked-fractions ]"
+ },
+ "numeric-spacing-values": {
+ "syntax": "[ proportional-nums | tabular-nums ]"
+ },
+ "nth": {
+ "syntax": "<an-plus-b> | even | odd"
+ },
+ "opacity()": {
+ "syntax": "opacity( [ <number-percentage> ] )"
+ },
+ "overflow-position": {
+ "syntax": "unsafe | safe"
+ },
+ "outline-radius": {
+ "syntax": "<length> | <percentage>"
+ },
+ "page-body": {
+ "syntax": "<declaration>? [ ; <page-body> ]? | <page-margin-box> <page-body>"
+ },
+ "page-margin-box": {
+ "syntax": "<page-margin-box-type> '{' <declaration-list> '}'"
+ },
+ "page-margin-box-type": {
+ "syntax": "@top-left-corner | @top-left | @top-center | @top-right | @top-right-corner | @bottom-left-corner | @bottom-left | @bottom-center | @bottom-right | @bottom-right-corner | @left-top | @left-middle | @left-bottom | @right-top | @right-middle | @right-bottom"
+ },
+ "page-selector-list": {
+ "syntax": "[ <page-selector># ]?"
+ },
+ "page-selector": {
+ "syntax": "<pseudo-page>+ | <ident> <pseudo-page>*"
+ },
+ "path()": {
+ "syntax": "path( [ <fill-rule>, ]? <string> )"
+ },
+ "paint()": {
+ "syntax": "paint( <ident>, <declaration-value>? )"
+ },
+ "perspective()": {
+ "syntax": "perspective( <length> )"
+ },
+ "polygon()": {
+ "syntax": "polygon( <fill-rule>? , [ <length-percentage> <length-percentage> ]# )"
+ },
+ "position": {
+ "syntax": "[ [ left | center | right ] || [ top | center | bottom ] | [ left | center | right | <length-percentage> ] [ top | center | bottom | <length-percentage> ]? | [ [ left | right ] <length-percentage> ] && [ [ top | bottom ] <length-percentage> ] ]"
+ },
+ "pseudo-class-selector": {
+ "syntax": "':' <ident-token> | ':' <function-token> <any-value> ')'"
+ },
+ "pseudo-element-selector": {
+ "syntax": "':' <pseudo-class-selector>"
+ },
+ "pseudo-page": {
+ "syntax": ": [ left | right | first | blank ]"
+ },
+ "quote": {
+ "syntax": "open-quote | close-quote | no-open-quote | no-close-quote"
+ },
+ "radial-gradient()": {
+ "syntax": "radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )"
+ },
+ "relative-selector": {
+ "syntax": "<combinator>? <complex-selector>"
+ },
+ "relative-selector-list": {
+ "syntax": "<relative-selector>#"
+ },
+ "relative-size": {
+ "syntax": "larger | smaller"
+ },
+ "repeat-style": {
+ "syntax": "repeat-x | repeat-y | [ repeat | space | round | no-repeat ]{1,2}"
+ },
+ "repeating-linear-gradient()": {
+ "syntax": "repeating-linear-gradient( [ <angle> | to <side-or-corner> ]? , <color-stop-list> )"
+ },
+ "repeating-radial-gradient()": {
+ "syntax": "repeating-radial-gradient( [ <ending-shape> || <size> ]? [ at <position> ]? , <color-stop-list> )"
+ },
+ "rgb()": {
+ "syntax": "rgb( <percentage>{3} [ / <alpha-value> ]? ) | rgb( <number>{3} [ / <alpha-value> ]? ) | rgb( <percentage>#{3} , <alpha-value>? ) | rgb( <number>#{3} , <alpha-value>? )"
+ },
+ "rgba()": {
+ "syntax": "rgba( <percentage>{3} [ / <alpha-value> ]? ) | rgba( <number>{3} [ / <alpha-value> ]? ) | rgba( <percentage>#{3} , <alpha-value>? ) | rgba( <number>#{3} , <alpha-value>? )"
+ },
+ "rotate()": {
+ "syntax": "rotate( [ <angle> | <zero> ] )"
+ },
+ "rotate3d()": {
+ "syntax": "rotate3d( <number> , <number> , <number> , [ <angle> | <zero> ] )"
+ },
+ "rotateX()": {
+ "syntax": "rotateX( [ <angle> | <zero> ] )"
+ },
+ "rotateY()": {
+ "syntax": "rotateY( [ <angle> | <zero> ] )"
+ },
+ "rotateZ()": {
+ "syntax": "rotateZ( [ <angle> | <zero> ] )"
+ },
+ "saturate()": {
+ "syntax": "saturate( <number-percentage> )"
+ },
+ "scale()": {
+ "syntax": "scale( <number> , <number>? )"
+ },
+ "scale3d()": {
+ "syntax": "scale3d( <number> , <number> , <number> )"
+ },
+ "scaleX()": {
+ "syntax": "scaleX( <number> )"
+ },
+ "scaleY()": {
+ "syntax": "scaleY( <number> )"
+ },
+ "scaleZ()": {
+ "syntax": "scaleZ( <number> )"
+ },
+ "self-position": {
+ "syntax": "center | start | end | self-start | self-end | flex-start | flex-end"
+ },
+ "shape-radius": {
+ "syntax": "<length-percentage> | closest-side | farthest-side"
+ },
+ "skew()": {
+ "syntax": "skew( [ <angle> | <zero> ] , [ <angle> | <zero> ]? )"
+ },
+ "skewX()": {
+ "syntax": "skewX( [ <angle> | <zero> ] )"
+ },
+ "skewY()": {
+ "syntax": "skewY( [ <angle> | <zero> ] )"
+ },
+ "sepia()": {
+ "syntax": "sepia( <number-percentage> )"
+ },
+ "shadow": {
+ "syntax": "inset? && <length>{2,4} && <color>?"
+ },
+ "shadow-t": {
+ "syntax": "[ <length>{2,3} && <color>? ]"
+ },
+ "shape": {
+ "syntax": "rect(<top>, <right>, <bottom>, <left>)"
+ },
+ "shape-box": {
+ "syntax": "<box> | margin-box"
+ },
+ "side-or-corner": {
+ "syntax": "[ left | right ] || [ top | bottom ]"
+ },
+ "single-animation": {
+ "syntax": "<time> || <timing-function> || <time> || <single-animation-iteration-count> || <single-animation-direction> || <single-animation-fill-mode> || <single-animation-play-state> || [ none | <keyframes-name> ]"
+ },
+ "single-animation-direction": {
+ "syntax": "normal | reverse | alternate | alternate-reverse"
+ },
+ "single-animation-fill-mode": {
+ "syntax": "none | forwards | backwards | both"
+ },
+ "single-animation-iteration-count": {
+ "syntax": "infinite | <number>"
+ },
+ "single-animation-play-state": {
+ "syntax": "running | paused"
+ },
+ "single-transition": {
+ "syntax": "[ none | <single-transition-property> ] || <time> || <timing-function> || <time>"
+ },
+ "single-transition-property": {
+ "syntax": "all | <custom-ident>"
+ },
+ "size": {
+ "syntax": "closest-side | farthest-side | closest-corner | farthest-corner | <length> | <length-percentage>{2}"
+ },
+ "step-position": {
+ "syntax": "jump-start | jump-end | jump-none | jump-both | start | end"
+ },
+ "step-timing-function": {
+ "syntax": "step-start | step-end | steps(<integer>[, <step-position>]?)"
+ },
+ "subclass-selector": {
+ "syntax": "<id-selector> | <class-selector> | <attribute-selector> | <pseudo-class-selector>"
+ },
+ "supports-condition": {
+ "syntax": "not <supports-in-parens> | <supports-in-parens> [ and <supports-in-parens> ]* | <supports-in-parens> [ or <supports-in-parens> ]*"
+ },
+ "supports-in-parens": {
+ "syntax": "( <supports-condition> ) | <supports-feature> | <general-enclosed>"
+ },
+ "supports-feature": {
+ "syntax": "<supports-decl> | <supports-selector-fn>"
+ },
+ "supports-decl": {
+ "syntax": "( <declaration> )"
+ },
+ "supports-selector-fn": {
+ "syntax": "selector( <complex-selector> )"
+ },
+ "symbol": {
+ "syntax": "<string> | <image> | <custom-ident>"
+ },
+ "target": {
+ "syntax": "<target-counter()> | <target-counters()> | <target-text()>"
+ },
+ "target-counter()": {
+ "syntax": "target-counter( [ <string> | <url> ] , <custom-ident> , <counter-style>? )"
+ },
+ "target-counters()": {
+ "syntax": "target-counters( [ <string> | <url> ] , <custom-ident> , <string> , <counter-style>? )"
+ },
+ "target-text()": {
+ "syntax": "target-text( [ <string> | <url> ] , [ content | before | after | first-letter ]? )"
+ },
+ "time-percentage": {
+ "syntax": "<time> | <percentage>"
+ },
+ "timing-function": {
+ "syntax": "linear | <cubic-bezier-timing-function> | <step-timing-function>"
+ },
+ "track-breadth": {
+ "syntax": "<length-percentage> | <flex> | min-content | max-content | auto"
+ },
+ "track-list": {
+ "syntax": "[ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?"
+ },
+ "track-repeat": {
+ "syntax": "repeat( [ <positive-integer> ] , [ <line-names>? <track-size> ]+ <line-names>? )"
+ },
+ "track-size": {
+ "syntax": "<track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( [ <length> | <percentage> ] )"
+ },
+ "transform-function": {
+ "syntax": "<matrix()> | <translate()> | <translateX()> | <translateY()> | <scale()> | <scaleX()> | <scaleY()> | <rotate()> | <skew()> | <skewX()> | <skewY()> | <matrix3d()> | <translate3d()> | <translateZ()> | <scale3d()> | <scaleZ()> | <rotate3d()> | <rotateX()> | <rotateY()> | <rotateZ()> | <perspective()>"
+ },
+ "transform-list": {
+ "syntax": "<transform-function>+"
+ },
+ "translate()": {
+ "syntax": "translate( <length-percentage> , <length-percentage>? )"
+ },
+ "translate3d()": {
+ "syntax": "translate3d( <length-percentage> , <length-percentage> , <length> )"
+ },
+ "translateX()": {
+ "syntax": "translateX( <length-percentage> )"
+ },
+ "translateY()": {
+ "syntax": "translateY( <length-percentage> )"
+ },
+ "translateZ()": {
+ "syntax": "translateZ( <length> )"
+ },
+ "type-or-unit": {
+ "syntax": "string | color | url | integer | number | length | angle | time | frequency | cap | ch | em | ex | ic | lh | rlh | rem | vb | vi | vw | vh | vmin | vmax | mm | Q | cm | in | pt | pc | px | deg | grad | rad | turn | ms | s | Hz | kHz | %"
+ },
+ "type-selector": {
+ "syntax": "<wq-name> | <ns-prefix>? '*'"
+ },
+ "var()": {
+ "syntax": "var( <custom-property-name> , <declaration-value>? )"
+ },
+ "viewport-length": {
+ "syntax": "auto | <length-percentage>"
+ },
+ "wq-name": {
+ "syntax": "<ns-prefix>? <ident-token>"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/syntaxes.schema.json b/node_modules/csso/node_modules/mdn-data/css/syntaxes.schema.json
new file mode 100644
index 0000000..45632c4
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/syntaxes.schema.json
@@ -0,0 +1,15 @@
+{
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "syntax"
+ ],
+ "properties": {
+ "syntax": {
+ "type": "string"
+ }
+ }
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/types.json b/node_modules/csso/node_modules/mdn-data/css/types.json
new file mode 100644
index 0000000..944e371
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/types.json
@@ -0,0 +1,265 @@
+{
+ "an-plus-b": {
+ "groups": [
+ "Selectors"
+ ],
+ "status": "standard"
+ },
+ "angle": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/angle"
+ },
+ "angle-percentage": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/angle-percentage"
+ },
+ "basic-shape": {
+ "groups": [
+ "CSS Shapes",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/basic-shape"
+ },
+ "blend-mode": {
+ "groups": [
+ "Compositing and Blending",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/blend-mode"
+ },
+ "color": {
+ "groups": [
+ "CSS Color",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/color_value"
+ },
+ "custom-ident": {
+ "groups": [
+ "CSS Will Change",
+ "CSS Counter Styles",
+ "CSS Lists and Counters",
+ "CSS Animations",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/custom-ident"
+ },
+ "dimension": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/dimension"
+ },
+ "display-outside": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-outside"
+ },
+ "display-inside": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-inside"
+ },
+ "display-listitem": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-listitem"
+ },
+ "display-internal": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-internal"
+ },
+ "display-box": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-box"
+ },
+ "display-legacy": {
+ "groups": [
+ "CSS Display"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/display-legacy"
+ },
+ "filter-function": {
+ "groups": [
+ "Filter Effects"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/filter-function"
+ },
+ "flex": {
+ "groups": [
+ "CSS Grid Layout",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/flex_value"
+ },
+ "frequency": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/frequency"
+ },
+ "frequency-percentage": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/frequency-percentage"
+ },
+ "gradient": {
+ "groups": [
+ "CSS Images",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/gradient"
+ },
+ "ident": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard"
+ },
+ "image": {
+ "groups": [
+ "CSS Images",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/image"
+ },
+ "integer": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/integer"
+ },
+ "length": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/length"
+ },
+ "length-percentage": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/length-percentage"
+ },
+ "number": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/number"
+ },
+ "percentage": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/percentage"
+ },
+ "position": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/position_value"
+ },
+ "ratio": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/ratio"
+ },
+ "resolution": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/resolution"
+ },
+ "shape": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/shape"
+ },
+ "string": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/string"
+ },
+ "time": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/time"
+ },
+ "time-percentage": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/time-percentage"
+ },
+ "timing-function": {
+ "groups": [
+ "CSS Animations",
+ "CSS Transitions",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/timing-function"
+ },
+ "transform-function": {
+ "groups": [
+ "CSS Transforms",
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/transform-function"
+ },
+ "url": {
+ "groups": [
+ "CSS Types"
+ ],
+ "status": "standard",
+ "mdn_url": "https://developer.mozilla.org/docs/Web/CSS/url"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/types.schema.json b/node_modules/csso/node_modules/mdn-data/css/types.schema.json
new file mode 100644
index 0000000..2200773
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/types.schema.json
@@ -0,0 +1,32 @@
+{
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "groups": {
+ "type": "array",
+ "minitems": 1,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "definitions.json#/groupList"
+ }
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental"
+ ]
+ },
+ "mdn_url": {
+ "type": "string",
+ "pattern": "^https://developer.mozilla.org/docs/Web/CSS/"
+ }
+ },
+ "required": [
+ "groups",
+ "status"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/units.json b/node_modules/csso/node_modules/mdn-data/css/units.json
new file mode 100644
index 0000000..3cf8062
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/units.json
@@ -0,0 +1,199 @@
+{
+ "ch": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "cm": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "deg": {
+ "groups": [
+ "CSS Units",
+ "CSS Angles"
+ ],
+ "status": "standard"
+ },
+ "dpcm": {
+ "groups": [
+ "CSS Units",
+ "CSS Resolutions"
+ ],
+ "status": "standard"
+ },
+ "dpi": {
+ "groups": [
+ "CSS Units",
+ "CSS Resolutions"
+ ],
+ "status": "standard"
+ },
+ "dppx": {
+ "groups": [
+ "CSS Units",
+ "CSS Resolutions"
+ ],
+ "status": "standard"
+ },
+ "em": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "ex": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "fr": {
+ "groups": [
+ "CSS Units",
+ "CSS Flexible Lengths",
+ "CSS Grid Layout"
+ ],
+ "status": "standard"
+ },
+ "grad": {
+ "groups": [
+ "CSS Units",
+ "CSS Angles"
+ ],
+ "status": "standard"
+ },
+ "Hz": {
+ "groups": [
+ "CSS Units",
+ "CSS Frequencies"
+ ],
+ "status": "standard"
+ },
+ "in": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "kHz": {
+ "groups": [
+ "CSS Units",
+ "CSS Frequencies"
+ ],
+ "status": "standard"
+ },
+ "mm": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "ms": {
+ "groups": [
+ "CSS Units",
+ "CSS Times"
+ ],
+ "status": "standard"
+ },
+ "pc": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "pt": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "px": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "Q": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "rad": {
+ "groups": [
+ "CSS Units",
+ "CSS Angles"
+ ],
+ "status": "standard"
+ },
+ "rem": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "s": {
+ "groups": [
+ "CSS Units",
+ "CSS Times"
+ ],
+ "status": "standard"
+ },
+ "turn": {
+ "groups": [
+ "CSS Units",
+ "CSS Angles"
+ ],
+ "status": "standard"
+ },
+ "vh": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "vmax": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "vmin": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "vw": {
+ "groups": [
+ "CSS Units",
+ "CSS Lengths"
+ ],
+ "status": "standard"
+ },
+ "x": {
+ "groups": [
+ "CSS Units",
+ "CSS Resolutions"
+ ],
+ "status": "standard"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/css/units.schema.json b/node_modules/csso/node_modules/mdn-data/css/units.schema.json
new file mode 100644
index 0000000..b60b461
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/css/units.schema.json
@@ -0,0 +1,28 @@
+{
+ "type": "object",
+ "additionalProperties": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "groups": {
+ "type": "array",
+ "minitems": 1,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "definitions.json#/groupList"
+ }
+ },
+ "status": {
+ "enum": [
+ "standard",
+ "nonstandard",
+ "experimental"
+ ]
+ }
+ },
+ "required": [
+ "groups",
+ "status"
+ ]
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/index.js b/node_modules/csso/node_modules/mdn-data/index.js
new file mode 100644
index 0000000..3b0f09f
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/index.js
@@ -0,0 +1,5 @@
+module.exports = {
+ api: require('./api'),
+ css: require('./css'),
+ l10n: require('./l10n'),
+}
diff --git a/node_modules/csso/node_modules/mdn-data/l10n/css.json b/node_modules/csso/node_modules/mdn-data/l10n/css.json
new file mode 100644
index 0000000..7518dd0
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/l10n/css.json
@@ -0,0 +1,1567 @@
+{
+ "absoluteLength": {
+ "de": "absolute {{cssxref(\"length\")}}",
+ "en-US": "absolute {{cssxref(\"length\")}}",
+ "fr": "une longueur (type {{cssxref(\"length\")}}) absolue",
+ "ja": "絶対ēćŖ{{cssxref(\"length\", \"é·ć\")}}",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń {{cssxref(\"length\")}}"
+ },
+ "absoluteLength0ForNone": {
+ "de": "eine absolute Länge; falls das Schlüsselwort <code>none</code> angegeben wurde, ist der berechnete Wert <code>0</code>",
+ "en-US": "an absolute length; if the keyword <code>none</code> is specified, the computed value is <code>0</code>",
+ "fr": "une longueur absolue ; si le mot-clé <code>none</code> est spécifié, la valeur calculée sera <code>0</code>",
+ "ja": "絶対ēćŖé·ćććć¼ćÆć¼ć <code>none</code> ćęå®ććććØčØē®å¤ćÆ <code>0</code> ć«ćŖć",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина; ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Š¾ ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>none</code>, вŃŃŠøŃленное Š·Š½Š°Ńение - <code>0</code>"
+ },
+ "absoluteLength0IfColumnRuleStyleNoneOrHidden": {
+ "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"column-rule-style\")}} <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "the absolute length; <code>0</code> if the {{cssxref(\"column-rule-style\")}} is <code>none</code> or <code>hidden</code>",
+ "fr": "une longueur absolue ou <code>0</code> si {{cssxref(\"column-rule-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+ "ja": "絶対ēćŖé·ććåć®ē½«ē·ć®ć¹ćæć¤ć«ć <code>none</code> ć <code>hidden</code> ćŖć <code>0</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина; <code>0</code>, ŠµŃŠ»Šø {{cssxref(\"column-rule-style\")}} - <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthOr0IfBorderBottomStyleNoneOrHidden": {
+ "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-bottom-style\")}} <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-bottom-style\")}} is <code>none</code> or <code>hidden</code>",
+ "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-bottom-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+ "ja": "絶対ēćŖé·ććć¾ć㯠{{cssxref(\"border-bottom-style\")}} ć <code>none</code> ć¾ć㯠<code>hidden</code> ć®å “å㯠<code>0</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>0</code>, ŠµŃŠ»Šø {{cssxref(\"border-bottom-style\")}} - <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthOr0IfBorderLeftStyleNoneOrHidden": {
+ "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-left-style\")}} <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-left-style\")}} is <code>none</code> or <code>hidden</code>",
+ "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-left-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+ "ja": "絶対ēćŖé·ććć¾ć㯠{{cssxref(\"border-left-style\")}} ć <code>none</code> ć¾ć㯠<code>hidden</code> ć®å “å㯠<code>0</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>0</code>, ŠµŃŠ»Šø {{cssxref(\"border-left-style\")}} - <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthOr0IfBorderRightStyleNoneOrHidden": {
+ "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-right-style\")}} <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-right-style\")}} is <code>none</code> or <code>hidden</code>",
+ "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-right-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+ "ja": "絶対ēćŖé·ććć¾ć㯠{{cssxref(\"border-right-style\")}} ć <code>none</code> ć¾ć㯠<code>hidden</code> ć®å “å㯠<code>0</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>0</code>, ŠµŃŠ»Šø {{cssxref(\"border-right-style\")}} - <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthOr0IfBorderTopStyleNoneOrHidden": {
+ "de": "die absolute Länge; <code>0</code> falls {{cssxref(\"border-top-style\")}} <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "the absolute length or <code>0</code> if {{cssxref(\"border-top-style\")}} is <code>none</code> or <code>hidden</code>",
+ "fr": "la longueur absolue ou <code>0</code> si {{cssxref(\"border-top-style\")}} vaut <code>none</code> ou <code>hidden</code>",
+ "ja": "絶対ēćŖé·ććć¾ć㯠{{cssxref(\"border-top-style\")}} ć <code>none</code> ć¾ć㯠<code>hidden</code> ć®å “å㯠<code>0</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>0</code>, ŠµŃŠ»Šø {{cssxref(\"border-top-style\")}} - <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthOrAsSpecified": {
+ "de": "für Prozent- und Längenwerte die absolute Länge, ansonsten wie angegeben",
+ "en-US": "for percentage and length values, the absolute length, otherwise as specified",
+ "fr": "pour les valeurs en pourcentages ou en longueur, la longueur absolue, sinon, comme spécifié",
+ "ja": "ćć¼ć»ć³ćć¼ćøć length ćęå®ćććØēµ¶åƾēćŖå¤ććć仄å¤ćÆęå®éć",
+ "ru": "Š“Š»Ń ŠæŃŠ¾ŃŠµŠ½ŃŠ¾Š² Šø Š·Š½Š°ŃŠµŠ½ŠøŠ¹ Глин, Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š¹ ГлинŃ, ŠµŃŠ»Šø Š“ŃŃŠ³Š¾Šµ не ŃŠŗŠ°Š·Š°Š½Š¾"
+ },
+ "absoluteLengthOrKeyword": {
+ "de": "für Prozentwerte und Längenwerte die absolute Länge, ansonsten das Schlüsselwort wie angegeben",
+ "en-US": "for percentage and length values, the absolute length, otherwise the keyword as specified",
+ "fr": "pour les valeurs exprimées en pourcentages ou en longueur, la longueur absolue, sinon, le mot-clé comme spécifié",
+ "ja": "ćć¼ć»ć³ćć¼ćøćé·ććęå®ćććØēµ¶åƾēćŖå¤ććć仄å¤ćÆęå®ććććć¼ćÆć¼ć",
+ "ru": "Š“Š»Ń ŠæŃŠ¾ŃŠµŠ½ŃŠ¾Š² Šø Š·Š½Š°ŃŠµŠ½ŠøŠ¹ Глин, Š°Š±ŃŠ¾Š»ŃŃŠ½ŃŃ
Глин или ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Ń"
+ },
+ "absoluteLengthOrNone": {
+ "de": "die absolute Länge oder <code>none</code>",
+ "en-US": "the absolute length or <code>none</code>",
+ "fr": "la longueur absolue ou le mot-clé <code>none</code>",
+ "ja": "絶対ēćŖé·ćć¾ć㯠<code>none</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>none</code>"
+ },
+ "absoluteLengthOrNormal": {
+ "de": "die absolute Länge oder das Schlüsselwort <code>normal</code>",
+ "en-US": "the absolute length or the keyword <code>normal</code>",
+ "fr": "la longueur absolue ou le mot-clé <code>normal</code>",
+ "ja": "絶対ēćŖé·ćć¾ććÆćć¼ćÆć¼ć <code>normal</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>normal</code>"
+ },
+ "absoluteLengthOrPercentage": {
+ "de": "für {{cssxref(\"length\")}} der absolute Wert, ansonsten ein Prozentwert",
+ "en-US": "for {{cssxref(\"length\")}} the absolute value, otherwise a percentage",
+ "fr": "pour {{cssxref(\"length\")}}, la valeur absolue, sinon un pourcentage",
+ "ja": "{{cssxref(\"length\")}} ć®å “åćÆēµ¶åƾēćŖå¤ććć仄å¤ćÆćć¼ć»ć³ćå¤",
+ "ru": "Š“Š»Ń {{cssxref(\"length\")}} Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š³Š¾ Š·Š½Š°ŃŠµŠ½ŠøŃ, ŠøŠ½Š°ŃŠµ ŠæŃŠ¾ŃенŃ"
+ },
+ "absoluteLengthsSpecifiedColorAsSpecified": {
+ "de": "Längen absolut gemacht; angegebene Farben berechnet; ansonsten wie angegeben",
+ "en-US": "any length made absolute; any specified color computed; otherwise as specified",
+ "fr": "toute longueur sous forme absolue; toute couleur sous forme calculée; sinon comme spécifié",
+ "ja": "ęå®å¤ļ¼length ćÆå
Øć¦ēµ¶åƾå¤ćØćŖććcolor ć«ć¤ćć¦ćÆčØē®å¤ćØćŖćļ¼",
+ "ru": "Š»ŃŠ±Š°Ń Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина; ŃŠ°Š±Š¾ŃŠ°ŠµŃ Š»ŃŠ±Š¾Š¹ ŃŠŗŠ°Š·Š°Š½Š½Ńй ŃŠ²ŠµŃ; ŠµŃŠ»Šø Š“ŃŃŠ³Š¾Šµ не ŃŠŗŠ°Š·Š°Š½Š¾"
+ },
+ "absoluteLengthZeroIfBorderStyleNoneOrHidden": {
+ "de": "absolute Länge; <code>0</code>, falls der Rahmenstil <code>none</code> oder <code>hidden</code> ist",
+ "en-US": "absolute length; <code>0</code> if the border style is <code>none</code> or <code>hidden</code>",
+ "fr": "une longueur absolue ; <code>0</code> si le style de la bordure vaut <code>none</code> ou <code>hidden</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина; <code>0</code>, ŠµŃŠ»Šø ŃŃŠøŠ»Ń ŃŠ°Š¼ŠŗŠø <code>none</code> или <code>hidden</code>"
+ },
+ "absoluteLengthZeroOrLarger": {
+ "de": "the absolute length, zero oder larger",
+ "en-US": "the absolute length, zero or larger",
+ "fr": "la valeur absolue valant zéro ou plus",
+ "ja": "ć¼ć仄äøć®ēµ¶åƾēćŖé·ć",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина, Š½Š¾Š»Ń ŠøŠ»Šø болŃŃŠµ"
+ },
+ "absolutelyPositionedElements": {
+ "de": "absolut positionierte Elemente",
+ "en-US": "absolutely positioned elements",
+ "fr": "éléments positionnés de manière absolue",
+ "ja": "絶対ä½ē½®ęå®ćććč¦ē“ ",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾ ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "absoluteURIOrNone": {
+ "de": "absolute URI oder <code>none</code>",
+ "en-US": "absolute URI or <code>none</code>",
+ "fr": "une URI absolue ou <code>none</code>",
+ "ru": "Š°Š±ŃŠ¾Š»ŃŃŠ½Ńй URI или <code>none</code>"
+ },
+ "all": {
+ "de": "alle",
+ "en-US": "all",
+ "fr": "tous",
+ "ja": "ćć¹ć¦",
+ "ru": "вŃŃ"
+ },
+ "allElements": {
+ "de": "alle Elemente",
+ "en-US": "all elements",
+ "fr": "tous les éléments",
+ "ja": "ćć¹ć¦ć®č¦ē“ ",
+ "pl": "wszystkich elementów",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "allElementsAcceptingWidthOrHeight": {
+ "de": "alle Elemente, die Breite oder Höhe akzeptieren",
+ "en-US": "all elements that accept width or height",
+ "fr": "tous les éléments acceptant une largeur ou une hauteur",
+ "ja": "width ććć³ height ćåćä»ććå
Øć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŠ¾ŃŠ¾ŃŃŠµ могŃŃ ŠøŠ¼ŠµŃŃ ŃŠøŃŠøŠ½Ń Šø вŃŃŠ¾ŃŃ"
+ },
+ "allElementsAndPseudos": {
+ "de": "alle Elemente, {{cssxref(\"::before\")}} und {{cssxref(\"::after\")}} <a href=\"/de/docs/Web/CSS/Pseudo-elements\">Pseudoelemente</a>",
+ "en-US": "all elements, {{cssxref(\"::before\")}} and {{cssxref(\"::after\")}} <a href=\"/en-US/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a>",
+ "es": "todos los elementos y los <a href=\"/es/docs/Web/CSS/Pseudoelementos\">pseudoelementos</a> {{cssxref(\"::before\")}} y {{cssxref(\"::after\")}}",
+ "fr": "tous les éléments, ainsi que les <a href=\"/fr/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a> {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}}",
+ "ja": "ćć¹ć¦ć®č¦ē“ ć{{cssxref(\"::before\")}} / {{cssxref(\"::after\")}} <a href=\"/ja/docs/Web/CSS/Pseudo-elements\">ēä¼¼č¦ē“ </a>",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, {{cssxref(\"::before\")}} Šø {{cssxref(\"::after\")}} <a href=\"/ru/docs/Web/CSS/Pseudo-elements\">ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ</a>"
+ },
+ "allElementsButNonReplacedAndTableColumns": {
+ "de": "alle Elemente außer nicht ersetzte Inlineelemente, Tabellenspalten und Spaltengruppen",
+ "en-US": "all elements but non-replaced inline elements, table columns, and column groups",
+ "es": "elementos de bloque o remplazados",
+ "fr": "tous les éléments sauf les éléments en ligne non remplacés, les colonnes de tableaux et les groupes de colonnes",
+ "ja": "éē½®ęć¤ć³ć©ć¤ć³č¦ē“ ććć¼ćć«ć®åćåć°ć«ć¼ććé¤ććć¹ć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ Š½ŠµŠ·Š°Š¼ŠµŠ½ŃŠµŠ¼ŃŃ
ŃŃŃŠ¾ŃнŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов, ŃŠ°Š±Š»ŠøŃнŃŃ
колонок Šø гŃŃŠæŠæ колонок"
+ },
+ "allElementsButNonReplacedAndTableRows": {
+ "de": "alle Elemente außer nicht ersetzte Inlineelemente, Tabellenzeilen und Zeilengruppen",
+ "en-US": "all elements but non-replaced inline elements, table rows, and row groups",
+ "fr": "tous les éléments sauf les éléments en ligne non remplacés, les lignes de tableaux et les groupes de lignes",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ Š½ŠµŠ·Š°Š¼ŠµŠ½ŃŠµŠ¼ŃŃ
ŃŃŃŠ¾ŃнŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов, ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŃŃŠ¾Šŗ Šø гŃŃŠæŠæ ŃŃŃŠ¾Šŗ"
+ },
+ "allElementsCreatingNativeWindows": {
+ "de": "alle Elemente, die native Fenster erstellen, z. B. <window>, <panel>",
+ "en-US": "all elements that create native windows, e.g. <window>, <panel>",
+ "fr": "tous les éléments qui créent des fenêtres natives, par exemple <window>, <panel>",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŃŠ¾Š·Š“аŃŃŠøŠµ Š½Š°ŃŠøŠ²Š½Ńе окна, Š½Š°ŠæŃŠøŠ¼ŠµŃ, <window>, <panel>"
+ },
+ "allElementsExceptGeneratedContentOrPseudoElements": {
+ "de": "alle Elemente außer generierte Inhalte oder Pseudoelemente",
+ "en-US": "all elements except generated content or pseudo-elements",
+ "fr": "tous les éléments sauf le contenu généré ou les pseudo-éléments",
+ "ja": "ēęć³ć³ćć³ćåć³ēä¼¼č¦ē“ ćé¤ććć¹ć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ ŃŠ³ŠµŠ½ŠµŃŠøŃŠ¾Š²Š°Š½Š½Š¾Š³Š¾ ŠŗŠ¾Š½ŃŠµŠ½Ńа Šø ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½Ńов"
+ },
+ "allElementsExceptInlineBoxesAndInternalRubyOrTableBoxes": {
+ "de": "all elements except inline boxes and internal ruby or table boxes",
+ "en-US": "all elements except inline boxes and internal ruby or table boxes",
+ "fr": "all elements except inline boxes and internal ruby or table boxes",
+ "ja": "all elements except inline boxes and internal ruby or table boxes",
+ "ru": "all elements except inline boxes and internal ruby or table boxes"
+ },
+ "allElementsExceptInternalTableDisplayTypes": {
+ "de": "alle Elemente außer <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> und <code>table-column</code>",
+ "en-US": "all elements, except <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> and <code>table-column</code>",
+ "fr": "tous les éléments exceptés <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> et <code>table-column</code>",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ <code>table-row-group</code>, <code>table-header-group</code>, <code>table-footer-group</code>, <code>table-row</code>, <code>table-column-group</code> Šø <code>table-column</code>"
+ },
+ "allElementsExceptNonReplacedInlineElementsTableRowsColumnsRowColumnGroups": {
+ "de": "alle Elemente außer: nicht ersetzte Inlineelemente, Tabellenzeilen, Zeilengruppen, Tabellenspalten und Spaltengruppen",
+ "en-US": "all elements except: non-replaced inline elements, table rows, row groups, table columns, and column groups",
+ "fr": "tous les éléments sauf : les éléments en ligne non remplacés, les lignes, les groupes de lignes, les colonnes et les groupes de colonnes pour les tableaux",
+ "ja": "éē½®ęć¤ć³ć©ć¤ć³č¦ē“ ć蔨ć®č”ćč”ć°ć«ć¼ćć蔨ć®åćåć°ć«ć¼ććé¤ććć¹ć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ: Š½ŠµŠ·Š°Š¼ŠµŠ½ŃŠµŠ¼ŃŃ
ŃŃŃŠ¾ŃнŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов, ŃŃŃŠ¾Šŗ Šø колонок ŃŠ°Š±Š»ŠøŃ"
+ },
+ "allElementsExceptTableDisplayTypes": {
+ "de": "alle Elemente außer Elemente mit Tabellen-{{cssxref(\"display\")}}-Typen, die nicht <code>table-caption</code>, <code>table</code> und <code>inline-table</code> entsprechen",
+ "en-US": "all elements, except elements with table {{cssxref(\"display\")}} types other than <code>table-caption</code>, <code>table</code> and <code>inline-table</code>",
+ "fr": "tous les éléments exceptés ceux dont les types {{cssxref(\"display\")}} pour les tableaux ne sont pas <code>table-caption</code>, <code>table</code> et <code>inline-table</code>",
+ "ja": "<code>table-caption</code>, <code>table</code>, <code>inline-table</code> 仄å¤ć®č”Øć® {{cssxref(\"display\")}} 種å„ćé¤ććć¹ć¦ć®č¦ē“ ć",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ ŃŠ»ŠµŠ¼ŠµŠ½Ńов Ń ŃŠ°Š±Š»ŠøŃŠ½ŃŠ¼ ŃŠøŠæŠ¾Š¼ {{cssxref(\"display\")}}, Š¾ŃŠ»ŠøŃŠ½ŃŠ¼ Š¾Ń <code>table-caption</code>, <code>table</code> Šø <code>inline-table</code>"
+ },
+ "allElementsExceptTableElementsWhenCollapse": {
+ "de": "Alle Elemente, außer interne Tabellenelemente, falls {{cssxref(\"border-collapse\")}} <code>collapse</code> ist",
+ "en-US": "all elements, except internal table elements when {{cssxref(\"border-collapse\")}} is <code>collapse</code>",
+ "fr": "tous les éléments sauf les éléments de table internes lorsque {{cssxref(\"border-collapse\")}} vaut <code>collapse</code>",
+ "ja": "ćć¹ć¦ć®č¦ē“ ććć ć {{cssxref(\"border-collapse\")}} ć <code>collapse</code> ć®ćØććÆćć¼ćć«č¦ē“ å
éØć«ćććć®ćé¤ć",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ внŃŃŃŠµŠ½Š½ŠøŃ
ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов, когГа {{cssxref(\"border-collapse\")}}:<code>collapse</code>"
+ },
+ "allElementsExceptTableRowColumnGroupsTableRowsColumns": {
+ "de": "alle Elemente außer Tabellenzeilengruppen, Tabellenspaltengruppen, Tabellenzeilen und Tabellenspalten",
+ "en-US": "all elements except table row groups, table column groups, table rows, and table columns",
+ "fr": "tous les éléments exceptés les groupes de lignes, les groupes de colonnes des tableaux et les colonnes de tableaux",
+ "ja": "蔨ć®č”ć°ć«ć¼ćć蔨ć®åć°ć«ć¼ćć蔨ć®č”ć蔨ć®åćé¤ććć¹ć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ гŃŃŠæŠæ ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŃŃŠ¾Šŗ, гŃŃŠæŠæ ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŃŠ¾Š»Š±Ńов, ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŃŃŠ¾Šŗ Šø ŃŠ°Š±Š»ŠøŃнŃŃ
колонок"
+ },
+ "allElementsExceptTableRowGroupsRowsColumnGroupsAndColumns": {
+ "de": "alle Elemente außer Tabellenzeilengruppen, Zeilen, Spaltengruppen und Spalten",
+ "en-US": "all elements, except table row groups, rows, column groups, and columns",
+ "fr": "tous les éléments exceptés les groupes de lignes, les lignes, les groupes de colonnes et les colonnes de tableaux",
+ "ja": "蔨ć®č”ć°ć«ć¼ććåć°ć«ć¼ććč”ćåćé¤ććć¹ć¦ć®č¦ē“ ",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŠŗŃŠ¾Š¼Šµ гŃŃŠæŠæ ŃŠ°Š±Š»ŠøŃнŃŃ
ŃŃŃŠ¾Šŗ, ŃŃŠ¾Š»Š±Ńов, гŃŃŠæŠæ ŃŃŠ¾Š»Š±Ńов Šø ŃŃŠ¾Š»Š±Ńов"
+ },
+ "allElementsNoEffectIfDisplayNone": {
+ "de": "alle Elemente, hat jedoch keinen Effekt, falls der Wert von {{cssxref(\"display\")}} <code>none</code> ist",
+ "en-US": "all elements, but has no effect if the value of {{cssxref(\"display\")}} is <code>none</code>.",
+ "fr": "tous les éléments mais n'a aucun effet si la valeur de <code>display</code> est <code>none</code>.",
+ "ja": "ćć¹ć¦ć®č¦ē“ ććć ć {{cssxref(\"display\")}} ć <code>none</code> ćŖćå¹ęćęć”ć¾ććć",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, но не Š±ŃŠ“ŠµŃ ŃŃŃŠµŠŗŃа, ŠµŃŠ»Šø <code>display: none</code>"
+ },
+ "allElementsSomeValuesNoEffectOnNonInlineElements": {
+ "de": "Alle Elemente, einige Werte haben keine Wirkung bei non-inline Elementen",
+ "en-US": "all elements, though some values have no effect on non-inline elements",
+ "fr": "tous les éléments bien que certaines valeurs n'aient pas d'effet sur les éléments qui ne sont pas en ligne",
+ "ja": "ćć¹ć¦ć®č¦ē“ ććć ćäøéØć®å¤ćÆć¤ć³ć©ć¤ć³ć§ćŖćč¦ē“ ć«ćÆå¹ęćććć¾ćć",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, Ń
оŃŃ Š½ŠµŠŗŠ¾ŃŠ¾ŃŃŠµ Š·Š½Š°ŃŠµŠ½ŠøŃ не ŃŠ°Š±Š¾ŃаŃŃ Š½Š° не ŃŃŃŠ¾ŃнŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½ŃаŃ
"
+ },
+ "allElementsSVGContainerElements": {
+ "de": "alle Elemente; In SVG gilt betrifft dies Containerelemente mit Ausnahme des {{SVGElement(\"defs\")}} Elements und allen Grafikelementen",
+ "en-US": "all elements; In SVG, it applies to container elements excluding the {{SVGElement(\"defs\")}} element and all graphics elements",
+ "fr": "tous les éléments ; en SVG, cela s'applique aux éléments conteneurs à l'exception des éléments {{SVGElement(\"defs\")}} et des éléments graphiques",
+ "ja": "ćć¹ć¦ć®č¦ē“ ć SVG ć§ćÆć {{SVGElement(\"defs\")}} č¦ē“ åć³ćć¹ć¦ć®ć°ć©ćć£ććÆč¦ē“ ćé¤ććć³ć³ććć¼č¦ē“ ć«é©ēØććć¾ćć",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ; в SVG, ŃŃŠ¾ ŠæŃŠøŠ¼ŠµŠ½ŃеŃŃŃ Šŗ ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃам, ŠøŃŠŗŠ»ŃŃŠ°Ń ŃŠ»ŠµŠ¼ŠµŠ½Ń {{SVGElement(\"defs\")}} Šø Š²ŃŠµ Š³ŃŠ°ŃŠøŃŠµŃкие ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "allElementsSVGContainerGraphicsAndGraphicsReferencingElements": {
+ "de": "Alle Elemente. In SVG wird er auf Containerelemente, Grafikelemente und Grafiken referenzierende Elemente angewandt.",
+ "en-US": "All elements. In SVG, it applies to container elements, graphics elements, and graphics referencing elements.",
+ "fr": "Tous les éléments. En SVG, cela s'applique aux éléments de conteneurs, aux éléments graphiques et aux éléments faisant référence à des éléments graphiques.",
+ "ja": "ćć¹ć¦ć®č¦ē“ ć SVG ć§ćÆćć³ć³ććć¼č¦ē“ ćć°ć©ćć£ććÆč¦ē“ ćć°ć©ćć£ććÆåē
§č¦ē“ ć«é©ēØććć¾ćć",
+ "ru": "ŠŃе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ. Š SVG ŃŃŠ¾ ŠæŃŠøŠ¼ŠµŠ½ŃеŃŃŃ Šŗ ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃам, Š³ŃŠ°ŃŠøŃŠµŃким ŃŠ»ŠµŠ¼ŠµŠ½Ńам Šø ŃŠ»ŠµŠ¼ŠµŠ½Ńам Š³ŃŠ°ŃŠøŃеŃкой оŃŃŃŠ»ŠŗŠø."
+ },
+ "allElementsThatCanReferenceImages": {
+ "en-US": "Any element that can have an image applied to it, for example as a {{cssxref(\"background-image\")}}, {{cssxref(\"border-image\")}}, or {{cssxref(\"list-style-image\")}}.",
+ "ja": "{{cssxref(\"background-image\")}}, {{cssxref(\"border-image\")}}, {{cssxref(\"list-style-image\")}} ćŖć©ć§é©ēØćććē»åćęć¤ćć¹ć¦ć®č¦ē“ ć"
+ },
+ "allElementsUAsNotRequiredWhenCollapse": {
+ "de": "alle Elemente; aber User Agents sind nicht gezwungen dies auf <code>table</code> und <code>inline-table</code> Elemente anzuwenden, falls {{cssxref(\"border-collapse\")}} <code>collapse</code> ist. Das Verhalten bei internen Tabellenelementen ist momentan undefiniert.",
+ "en-US": "all elements; but User Agents are not required to apply to <code>table</code> and <code>inline-table</code> elements when {{cssxref(\"border-collapse\")}} is <code>collapse</code>. The behavior on internal table elements is undefined for the moment.",
+ "fr": "tous les éléments, mais les agents utilisateurs ne sont pas tenus de l'appliquer aux éléments de type <code>table</code> ou <code>inline-table</code> lorsque {{cssxref(\"border-collapse\")}} vaut <code>collapse</code>. Le comportement sur les éléments de type table interne est pour l'instant indéfini.",
+ "ru": "Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, но Š±ŃаŃзеŃŃ Š½Šµ ŠæŃŠøŠ¼ŠµŠ½ŃŃŃ Šŗ ŃŠ»ŠµŠ¼ŠµŠ½Ńам <code>table</code> Šø <code>inline-table</code>, когГа {{cssxref(\"border-collapse\")}}:<code>collapse</code>. ŠŠ¾Š²ŠµŠ“ение на внŃŃŃŠøŃŠ°Š±Š»ŠøŃŠ½ŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½ŃаŃ
не Š¾ŠæŃеГелено."
+ },
+ "allHTMLElements": {
+ "de": "alle HTML-Elemente",
+ "en-US": "all HTML elements",
+ "fr": "tous les éléments HTML",
+ "ru": "Š²ŃŠµ HTML ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "andInEnumeration": {
+ "de": " und ",
+ "en-US": " and ",
+ "fr": " et ",
+ "ru": " Šø "
+ },
+ "angleBasicShapeOrPath": {
+ "de": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} oder {{cssxref(\"<path()>\"}}",
+ "en-US": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} or {{cssxref(\"<path()>\"}}",
+ "fr": "{{cssxref(\"<angle>\"}}, {{cssxref(\"<basic-shape>\"}} ou {{cssxref(\"<path()>\"}}"
+ },
+ "angleOrBasicShapeOrPath": {
+ "de": "als <angle>, <basic-shape> oder <path()>",
+ "en-US": "as <angle>, <basic-shape> or <path()>",
+ "fr": "comme <angle>, <basic-shape> ou <path()>",
+ "ru": "как <angle>, <basic-shape> или <path()>"
+ },
+ "angleRoundedToNextQuarter": {
+ "de": "ein {{xref_cssangle}}, auf den nächsten Viertel von <code>0deg</code> gerundet (üblicherweise <code>1turn)</code>",
+ "en-US": "an {{xref_cssangle}}, rounded to the next quarter turn from <code>0deg</code> and normalized, that is moduloing the value by <code>1turn</code>",
+ "fr": "un {{xref_cssangle}}, arrondi au quart de tour supérieur (à partir de <code>0deg</code>) puis normalisé (modulo) pour obtenir l'angle relatif à un tour",
+ "ru": "{{xref_cssangle}}, Ń Š¾ŠŗŃŃŠ³Š»ŠµŠ½ŠøŠµŠ¼ Го ŃŠ»ŠµŠ“ŃŃŃŠµŠ¹ ŃŠµŃвеŃŃŠø Š¾Š±Š¾ŃŠ¾Ńа Š¾Ń <code>0deg</code> Šø Š½Š¾ŃŠ¼Š°Š»ŠøŠ·Š¾Š²Š°Š½Š½Ńй ŃŠ°Šŗ, ŃŃŠ¾ Š·Š½Š°ŃŠµŠ½ŠøŠµ - <code>1 ŠæŠ¾Š²Š¾ŃŠ¾Ń</code>"
+ },
+ "animationType": {
+ "de": "Animationstyp",
+ "en-US": "Animation type",
+ "fr": "Type d'animation",
+ "ja": "ć¢ćć”ć¼ć·ć§ć³ć®ēØ®é”"
+ },
+ "anyElementEffectOnProgressAndMeter": {
+ "de": "beliebige Elemente; es hat eine Auswirkung auf {{HTMLElement(\"progress\")}} und {{HTMLElement(\"meter\")}}, aber nicht auf <input type=\"range\"> oder andere Elemente",
+ "en-US": "any element; it has an effect on {{HTMLElement(\"progress\")}} and {{HTMLElement(\"meter\")}}, but not on <input type=\"range\"> or other elements",
+ "fr": "n'importe quel élément, aura un effet sur {{HTMLElement(\"progress\")}} et {{HTMLElement(\"meter\")}}, mais pas sur <input type=\"range\"> ou les autres éléments",
+ "ru": "Š»ŃŠ±Š¾Š¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń; ŠøŠ¼ŠµŠµŃ ŃŃŃŠµŠŗŃ на {{HTMLElement(\"progress\")}} Šø {{HTMLElement(\"meter\")}}, но не на <input type=\"range\"> или Š“ŃŃŠ³ŠøŃ
ŃŠ»ŠµŠ¼ŠµŠ½ŃаŃ
"
+ },
+ "appliesTo": {
+ "de": "Anwendbar auf",
+ "en-US": "Applies to",
+ "fr": "Applicabilité",
+ "ja": "é©ēØåÆ¾č±”",
+ "ko": "ģ ģ©ėģ",
+ "pl": "Stosowana do",
+ "pt-BR": "Aplica-se a",
+ "ru": "ŠŃŠøŠ¼ŠµŠ½ŃŠµŃŃŃ Šŗ",
+ "zh-CN": "éēØå
ē“ "
+ },
+ "applyingToMultiple": {
+ "de": "$1$. Auch anwendbar auf $2$.",
+ "en-US": "$1$. It also applies to $2$.",
+ "fr": "$1$. S'applique aussi à $2$.",
+ "ja": "$1$ć $2$ ć«ćé©ēØććć¾ćć",
+ "ru": "$1$. ŠŃо ŃŠ°ŠŗŠ¶Šµ ŠæŃŠøŠ¼ŠµŠ½ŃеŃŃŃ Šŗ $2$."
+ },
+ "asAutoOrColor": {
+ "en-US": "<code>auto</code> is computed as specified and <code><color></code> values are computed as defined for the {{cssxref(\"color\")}} property.",
+ "de": "<code>auto</code> wird wie angegeben berechnet und <code><color></code> Werte werden wie für die {{cssxref(\"color\")}} Eigenschaft berechnet.",
+ "ja": "<code>auto</code> ćÆä»ę§éćć«čØē®ććć <code><color></code> å¤ćÆ {{cssxref(\"color\")}} ććććć£ć§å®ē¾©ćććććć«čØē®ćććć"
+ },
+ "asDefinedForBasicShapeWithAbsoluteURIOtherwiseAsSpecified": {
+ "de": "wie definiert für {{cssxref(\"basic-shape\")}} (gefolgt von {{cssxref(\"shape-box\")}}, falls angegeben), dem {{cssxref(\"image\")}}, dessen URI absolut gemacht wurde, ansonsten wie angegeben.",
+ "en-US": "as defined for {{cssxref(\"basic-shape\")}} (with {{cssxref(\"shape-box\")}} following, if supplied), the {{cssxref(\"image\")}} with its URI made absolute, otherwise as specified.",
+ "fr": "comme défini pour {{cssxref(\"basic-shape\")}} (avec {{cssxref(\"shape-box\")}} qui suit s'il est utilisé), l'{{cssxref(\"image\")}} avec son URI rendue absolue, sinon, comme spécifié.",
+ "ru": "как Š¾ŠæŃеГелено Š“Š»Ń {{cssxref(\"basic-shape\")}} (c {{cssxref(\"shape-box\")}} ŠæŠ¾ŃŠ»ŠµŠ“ŃŃŃŠøŠ¼, ŠµŃŠ»Šø ŠæŠµŃŠµŠ“аеŃŃŃ), {{cssxref(\"image\")}} Ń ŠµŠ³Š¾ Š°Š±ŃŠ¾Š»ŃŃŠ½Ńм URI, ŠµŃŠ»Šø Š“ŃŃŠ³Š¾Šµ не ŃŠŗŠ°Š·Š°Š½Š¾"
+ },
+ "asLength": {
+ "de": "als {{cssxref(\"length\")}}",
+ "en-US": "as {{cssxref(\"length\")}}",
+ "fr": "comme {{cssxref(\"length\")}}",
+ "ru": "как {{cssxref(\"length\")}}"
+ },
+ "asLonghands": {
+ "de": "wie die jeweiligen Kurzschreibweisen:",
+ "en-US": "as each of the properties of the shorthand:",
+ "fr": "pour chaque propriété individuelle de la propriété raccourcie :",
+ "ja": "äøę¬ęå®ć®åććććć£ćØćć¦",
+ "ru": "как Šø Ń ŠŗŠ°Š¶Š“Š¾Š³Š¾ ŠøŠ· ŠæŠ¾Š“ŃŠ²Š¾Š¹ŃŃŠ² ŃŃŠ¾Š³Š¾ ŃŠ²Š¾Š¹ŃŃŠ²Š°:"
+ },
+ "asSpecified": {
+ "de": "wie angegeben",
+ "en-US": "as specified",
+ "es": "como se especifica",
+ "ca": "com s'especifica",
+ "fr": "comme spécifié",
+ "ja": "ęå®å¤",
+ "pl": "jako okreÅlone",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š¾"
+ },
+ "asSpecifiedAppliesToEachProperty": {
+ "de": "wie der angegebene Wert wird er auf alle Eigenschaften angewandt, für die dies eine Kurzschreibweise ist.",
+ "en-US": "as the specified value applies to each property this is a shorthand for.",
+ "fr": "comme la valeur spécifiée s'applique sur chaque propriété englobée par le raccourci",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, ŠæŃŠøŠ¼ŠµŠ½ŃеŃŃŃ Šŗ ŠŗŠ°Š¶Š“Š¾Š¼Ń ŃŠ²Š¾Š¹ŃŃŠ²Ń ŃŃŠ¾Š¹ ŠŗŠ¾ŃŠ¾Ńкой Š·Š°ŠæŠøŃŠø."
+ },
+ "asSpecifiedButVisibleOrClipReplacedToAutoOrHiddenIfOtherValueDifferent": {
+ "en-US": "as specified, except with <code>visible</code>/<code>clip</code> computing to <code>auto</code>/<code>hidden</code> respectively if one of {{cssxref(\"overflow-x\")}} or {{cssxref(\"overflow-y\")}} is neither <code>visible</code> nor </code>clip</code>",
+ "es": "como se especifica, excepto que si {{cssxref(\"overflow-x\")}} o bien {{cssxref(\"overflow-y\")}} es distinto de <code>visible</code> o <code>clip</code>, estos dos valores computan a <code>auto</code> o <code>hidden</code> respectivamente",
+ "ca": "com s'especifica, excepte que si {{cssxref(\"overflow-x\")}} o bé {{cssxref(\"overflow-y\")}} són diferents de <code>visible</code> o <code>clip</code>, aquests dos valors computen a <code>auto</code> o <code>hidden</code> respectivament"
+ },
+ "asSpecifiedExceptMatchParent": {
+ "de": "wie angegeben, außer für den <code>match-parent</code> Wert, welcher in Bezug auf den <code>direction</code> Wert des Elternelements berechnet wird und einen berechneten Wert von <code>left</code> oder <code>right</code> ergibt",
+ "en-US": "as specified, except for the <code>match-parent</code> value which is calculated against its parent's <code>direction</code> value and results in a computed value of either <code>left</code> or <code>right</code>",
+ "fr": "comme spécifié, sauf pour la valeur <code>match-parent</code> qui est calculée en fonction de la <code>direction</code> du parent et qui vaut soit <code>left</code>, soit <code>right</code>",
+ "ja": "ęå®å¤ććć ć <code>match-parent</code> å¤ćé¤ćććć®å¤ćÆč¦Ŗč¦ē“ ć®ę¹åć«ććØć„ćć¦čØē®ćććčØē®å¤ćå·¦å³ć©ć”ćć«ććŖćć¾ć",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š¾, ŠŗŃŠ¾Š¼Šµ Š·Š½Š°ŃŠµŠ½ŠøŃ <code>match-parent</code>, ŠŗŠ¾ŃŠ¾Ńое вŃŃŠøŃŠ»ŃŠµŃŃŃ Š²Š¼ŠµŃŃŠ¾ Š·Š½Š°ŃŠµŠ½ŠøŃ его ŃŠ¾Š“ŠøŃŠµŠ»Ń <code>direction</code>, а ŃŠµŠ·ŃŠ»ŃŃŠ°ŃŃ Š² вŃŃŠøŃленном Š·Š½Š°Ńении <code>left</code> или <code>right</code>"
+ },
+ "asSpecifiedExceptPositionedFloatingAndRootElementsKeywordMaybeDifferent": {
+ "de": "wie der angegebene Wert, außer für positionierte und umfließende Elemente und das Wurzelelement. In beiden Fällen kann der berechnete Wert ein Schlüsselwort sein, das nicht dem angegebenen entspricht.",
+ "en-US": "as the specified value, except for positioned and floating elements and the root element. In both cases the computed value may be a keyword other than the one specified.",
+ "fr": "comme la valeur spécifiée, excepté pour les éléments positionnés et flottants, ainsi que pour l'élément racine. Dans les deux cas, la valeur calculée peut être un mot clé différent de celui spécifié.",
+ "ja": "ęå®éćććć ćä½ē½®ęå®ćććč¦ē“ ćØććć¼ććć«ć¼ćč¦ē“ ćé¤ććććććÆčØē®å¤ćęå®ćććć®ćØéććć¼ćÆć¼ćć«ćŖćåÆč½ę§ćććć¾ć",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, ŠŗŃŠ¾Š¼Šµ как Š“Š»Ń ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃованнŃŃ
Šø плаваŃŃŠøŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов Šø ŠŗŠ¾ŃŠ½ŠµŠ²Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńа. РобоиŃ
ŃŠ»ŃŃŠ°ŃŃ
вŃŃŠøŃŠ»ŃŠµŠ¼Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ Š¼Š¾Š¶ŠµŃ Š±ŃŃŃ ŠŗŠ»ŃŃŠµŠ²Ńм ŃŠ»Š¾Š²Š¾Š¼, Š¾ŃŠ»ŠøŃŠ½ŃŠ¼ Š¾Ń ŃŠŗŠ°Š·Š°Š½Š½Š¾Š³Š¾."
+ },
+ "asSpecifiedRelativeToAbsoluteLengths": {
+ "de": "relativ zur gleichen Achse der Innenabstandsbox des Scrollcontainers",
+ "en-US": "as specified, but with relative lengths converted into absolute lengths",
+ "fr": "comme spécifié, mais avec les longueurs relatives converties en longueurs absolues",
+ "ja": "ęå®éćććć ćēøåƾē length ćÆēµ¶åƾē length ć«å¤ę",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š¾, но Ń Š¾ŃŠ½Š¾ŃŠøŃŠµŠ»Ńной Глиной, конвеŃŃŠøŃŃŠµŠ¼Š¾Š¹ в Š°Š±ŃолŃŃŠ½Ńе ГлинŃ"
+ },
+ "asSpecifiedURLsAbsolute": {
+ "de": "wie angegeben, aber mit absoluten {{cssxref(\"url\")}} Werten",
+ "en-US": "as specified, but with {{cssxref(\"url\")}} values made absolute",
+ "fr": "comme spécifié mais avec les valeurs {{cssxref(\"url\")}} rendues absolues",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š¾, но Ń Š°Š±ŃŠ¾Š»ŃŃŠ½Ńми Š·Š½Š°ŃениŃми {{cssxref(\"url\")}}"
+ },
+ "asSpecifiedWithExceptionOfResolution": {
+ "de": "wie angegeben mit Ausnahme von <resolution>, das möglicherweise durch den berechneten Wert für 'snap' geändert wird",
+ "en-US": "as specified, except with <resolution> possibly altered by computed for 'snap' value",
+ "fr": "telle que spécifiée, sauf avec <resolution> éventuellement modifiée lors du calcul par la valeur 'snap'",
+ "ru": "как ŃŠŗŠ°Š·Š°Š½Š¾, за ŠøŃŠŗŠ»ŃŃŠµŠ½ŠøŠµŠ¼ <resolution> Š¼Š¾Š¶ŠµŃ ŠøŠ·Š¼ŠµŠ½ŠøŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠµŠ¼ 'snap'"
+ },
+ "asSpecifiedWithLengthsAbsoluteAndNormalComputingToZeroExceptMultiColumn": {
+ "en-US": "as specified, with <length>s made absolute, and normal computing to zero except on multi-column elements",
+ "ja": "ęå®éćć§ć <length> ćÆēµ¶åƾé·ć«ćŖćć normal ć®čØē®å¤ćÆę®µēµćæč¦ē“ ćé¤ć 0 ć«ćŖć"
+ },
+ "asSpecifiedWithVarsSubstituted": {
+ "de": "wie angegeben, wobei Variablen ersetzt werden",
+ "en-US": "as specified with variables substituted",
+ "fr": "tel que spécifié avec les variables échangées"
+ },
+ "autoForSmartphoneBrowsersSupportingInflation": {
+ "de": "<code>auto</code> für Smartphone Browser, die Befüllung unterstützen, <code>none</code> andererseits (und dann unveränderbar).",
+ "en-US": "<code>auto</code> for smartphone browsers supporting inflation, <code>none</code> in other cases (and then not modifiable).",
+ "fr": "<code>auto</code> pour les navigateurs de smartphones qui supportent l'expansion, <code>none</code> in dans les autres cas (non modifiable alors).",
+ "ru": "<code>auto</code> Š“Š»Ń Š±ŃŠ°ŃŠ·ŠµŃŠ¾Š² в ŃŠ¼Š°ŃŃŃŠ¾Š½Š°Ń
ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŃŃŃ ŃŠ²ŠµŠ»ŠøŃение, <code>none</code> в Š“ŃŃŠ³ŠøŃ
ŃŠ»ŃŃŠ°ŃŃ
(Šø позже не ŠøŠ·Š¼ŠµŠ½ŃеŃŃŃ)."
+ },
+ "autoNonNegativeOrPercentage": {
+ "de": "<code>auto</code>, eine nicht negative Zahl oder ein Prozentwert wie angegeben",
+ "en-US": "<code>auto</code>, or a non-negative number or percentage as specified",
+ "fr": "<code>auto</code> ou un nombre positif ou nul ou un pourcentage, comme spécifié",
+ "ru": "<code>auto</code>, или заГаŃŃŃŃ Š½ŠµŠ¾ŃŃŠøŃŠ°ŃŠµŠ»Ńное ŃŠøŃло или ŠæŃоŃенŃ, как ŃŠŗŠ°Š·Š°Š½"
+ },
+ "autoOnAbsolutelyPositionedElementsValueOfAlignItemsOnParent": {
+ "de": "<code>auto</code> berechnet sich zu sich selbst bei absolut positionierten Elementen und zum berechneten Wert von {{cssxref(\"align-items\")}} des Elternelements (abzüglich veralteter Schlüsselwörter) bei allen anderen Boxen oder <code>start</code>, falls die Box kein Elternelement hat. Sein Verhalten hängt vom Layoutmodell ab, wie für {{cssxref(\"justify-self\")}} beschrieben. Ansonsten der angegebene Wert.",
+ "en-US": "<code>auto</code> computes to itself on absolutely-positioned elements, and to the computed value of {{cssxref(\"align-items\")}} on the parent (minus any legacy keywords) on all other boxes, or <code>start</code> if the box has no parent. Its behavior depends on the layout model, as described for {{cssxref(\"justify-self\")}}. Otherwise the specified value.",
+ "fr": "<code>auto</code> sera calculé comme <code>auto</code> pour les éléments positionnés de façon absolue, sera calculé comme {{cssxref(\"align-items\")}} sur le parent (excepté les mots-clés historiques utilisés) de toutes les autres boîtes ou comme <code>start</code> si la boîte n'a pas de parent. Son comportement dépend du modèle de disposition, décrit dans {{cssxref(\"justify-self\")}}, sinon ce sera la valeur spécifiée.",
+ "ru": "ŠæŃŠø <code>auto</code> Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾ ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Š²ŃŃŠøŃŠ»ŃŃŃ ŃŠ°Š¼Šø Šø вŃŃŠøŃленное Š·Š½Š°Ńение {{cssxref(\"align-items\")}} Š“Š»Ń ŃŠ¾Š“ŠøŃŠµŠ»Ń (ŠŗŃŠ¾Š¼Šµ ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š²) на оŃŃŠ°Š»ŃнŃŃ
блокаŃ
, или <code>start</code>, ŠµŃŠ»Šø Ń Š±Š»Š¾ŠŗŠ° Š½ŠµŃ ŃŠ¾Š“ŠøŃŠµŠ»Ń. ŠŠ³Š¾ повеГение Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š¼Š¾Š“ŠµŠ»Šø Š¼Š°ŠŗŠµŃŠ°, опиŃŃŠ²Š°ŠµŠ¼Š¾Š¹ {{cssxref(\"justify-self\")}}. ŠŠ½Š°Ńе ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ."
+ },
+ "autoOrRectangle": {
+ "de": "<code>auto</code>, falls als <code>auto</code> angegeben, ansonsten ein Rechteck mit vier Werten, von denen jeder <code>auto</code> ist, falls als <code>auto</code> angegeben, ansonsten die berechnete Länge",
+ "en-US": "<code>auto</code> if specified as <code>auto</code>, otherwise a rectangle with four values, each of which is <code>auto</code> if specified as <code>auto</code> or the computed length otherwise",
+ "fr": "<code>auto</code> si spécifié comme <code>auto</code>, sinon un rectangle avec quatre valeurs dont chacune vaut <code>auto</code> si elles sont spécifiées comme <code>auto</code> sinon, la longueur calculée",
+ "ja": "auto ęå®ććć¦ććć° autoććć仄å¤ćÆ 4 ć¤ć®å¤ććØććŖćē©å½¢ćē©å½¢ć®å “åćåå¤ćÆ auto ęå®ććć¦ććć° autoććć仄å¤ć§ćÆčØē®å¤",
+ "ru": "<code>auto</code>, ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Š¾ как <code>auto</code>, ŠøŠ½Š°ŃŠµ ŠæŃŃŠ¼Š¾ŃŠ³Š¾Š»ŃŠ½ŠøŠŗ Ń ŃŠµŃŃŃŃŠ¼Ń Š·Š½Š°ŃŠµŠ½ŠøŃми, кажГое ŠøŠ· ŠŗŠ¾ŃŠ¾ŃŃŃ
<code>auto</code>, ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Ń как <code>auto</code> или вŃŃŠøŃŠ»ŠµŠ½Š½Š°Ń Š“Š»ŠøŠ½Š° в ŠæŃоŃивном ŃŠ»ŃŃŠ°Šµ"
+ },
+ "basicShape": {
+ "de": "eine <a href=\"/de/docs/Web/CSS/shape-outside#Interpolation\" title=\"Werte des <basic-shape> CSS Datentyps interpolieren als einfache Liste. Die Listenwerte interpolieren als Länge, Prozentwert oder calc, wo möglich. Falls Listenwerte nicht einem dieser Typen entsprechen, aber identisch sind, werden diese Werte interpoliert.\">einfache Form</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/shape-outside#Interpolation\" title=\"Values of the <basic-shape> CSS data type interpolate as a simple list. The list values interpolate as length, percentage, or calc where possible. If list values are not one of those types but are identical, those values do interpolate.\">basic shape</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/shape-outside#Interpolation\" title=\"Les valeurs de type CSS <forme-basique> sont interpolées comme une liste simple. La liste de valeurs interpole la longueur, le pourcentage ou la valeur calculée. Si les valeurs de la liste ne sont pas de ces types mais sont identiques, les valeurs seront interpolées.\">forme basique (<code>basic-shape</code>)</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/shape-outside#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° <Š±Š°Š·Š¾Š²Š°Ń ŃŠøŠ³ŃŃŠ°> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ ŠæŃŠ¾ŃŃŠ¾Š¹ ŃŠæŠøŃŠ¾Šŗ. Š”ŠæŠøŃŠ¾Šŗ Š·Š½Š°ŃŠµŠ½ŠøŠ¹ ŠøŠ½ŃŠµŃполиŃŃŠµŃŃŃ ŠŗŠ°Šŗ Глина, ŠæŃŠ¾ŃенŃŃ, или ŃŠ°ŃŃŃŃ, гГе возможен. ŠŃли ŃŠæŠøŃŠ¾Šŗ Š·Š½Š°ŃŠµŠ½ŠøŠ¹ не оГинакового ŃŠøŠæŠ°, ŃŃŠø Š·Š½Š°ŃŠµŠ½ŠøŃ ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ.\">Š±Š°Š·Š¾Š²Š°Ń ŃŠøŠ³ŃŃŠ°</a>"
+ },
+ "basicShapeOtherwiseNo": {
+ "de": "ja, wie angegeben für {{cssxref(\"basic-shape\")}}, ansonsten nein",
+ "en-US": "yes, as specified for {{cssxref(\"basic-shape\")}}, otherwise no",
+ "fr": "oui, comme spécifié pour {{cssxref(\"basic-shape\")}}, sinon, non",
+ "ru": "Га, как ŃŠŗŠ°Š·Š°Š½Š¾ Š“Š»Ń {{cssxref(\"basic-shape\")}}, ŠøŠ½Š°ŃŠµ неŃ"
+ },
+ "beforeAndAfterPseudos": {
+ "de": "{{cssxref(\"::before\")}} und{{cssxref(\"::after\")}} <a href=\"/de/docs/Web/CSS/Pseudo-elements\">Pseudoelemente</a>",
+ "en-US": "{{cssxref(\"::before\")}} and {{cssxref(\"::after\")}} <a href=\"/en-US/docs/Web/CSS/Pseudo-elements\">pseudo-elements</a>",
+ "es": "los <a href=\"/es/docs/Web/CSS/Pseudoelementos\">pseudoelementos</a> {{cssxref(\"::before\")}} y {{cssxref(\"::after\")}}",
+ "fr": "<a href=\"/fr/docs/Web/CSS/Pseudo-éléments\">pseudo-éléments</a> {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}} ",
+ "ja": "{{cssxref(\"::before\")}} / {{cssxref(\"::after\")}} <a href=\"/ja/docs/Web/CSS/Pseudo-elements\">ēä¼¼č¦ē“ </a>",
+ "ru": "{{cssxref(\"::before\")}} Šø {{cssxref(\"::after\")}} <a href=\"/ru/docs/Web/CSS/Pseudo-elements\">ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ</a>"
+ },
+ "blockContainerElements": {
+ "de": "Blockcontainerelemente",
+ "en-US": "block container elements",
+ "fr": "les éléments conteneurs de blocs",
+ "ja": "ććććÆć³ć³ććć¼č¦ē“ ",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŠŗŠ¾Š½ŃейнеŃŃ"
+ },
+ "blockContainers": {
+ "de": "Blockcontainer",
+ "en-US": "block containers",
+ "fr": "conteneurs de type bloc",
+ "ja": "ććććÆć³ć³ććć¼",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŠŗŠ¾Š½ŃейнеŃŃ"
+ },
+ "blockContainersAndMultiColumnContainers": {
+ "de": "Blockcontainer und mehrspaltige Container",
+ "en-US": "Block containers and multi-column containers",
+ "ja": "ććććÆć³ć³ććć¼, ꮵēµćæćÆć³ć³ććć¼"
+ },
+ "blockContainersExceptMultiColumnContainers": {
+ "de": "Blockcontainer außer mehrspaltige Container",
+ "en-US": "Block containers except multi-column containers"
+ },
+ "blockContainersExceptTableWrappers": {
+ "de": "Blockcontainer außer Tabellen umgebende Boxen",
+ "en-US": "Block containers except table wrapper boxes"
+ },
+ "blockContainersFlexContainersGridContainers": {
+ "en-US": "Block-containers, flex containers, and grid containers",
+ "ja": "ććććÆć³ć³ććć¼, ćć¬ććÆć¹ć³ć³ććć¼, ć°ćŖććć³ć³ććć¼"
+ },
+ "blockElementsInNormalFlow": {
+ "de": "Blocklevelelemente in normalem Fluss des Wurzelelements. User Agents können es auch auf andere Elemente wie <code>table-row</code>-Elemente anwenden.",
+ "en-US": "block-level elements in the normal flow of the root element. User agents may also apply it to other elements like <code>table-row</code> elements.",
+ "fr": "les éléments de bloc dans le flux normal de l'élément racine. Les agents utilisateurs peuvent également l'appliquer sur d'autres éléments comme <code>table-row</code>.",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Š² Š½Š¾ŃŠ¼Š°Š»Ńном ŠæŠ¾ŃŠ¾ŠŗŠµ ŃŠ¾Š“ŠøŃŠµŠ»ŃŃŠŗŠ¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńа. ŠŃŠ°ŃŠ·ŠµŃŃ Š¼Š¾Š³ŃŃ ŃŠ°ŠŗŠ¶Šµ ŠæŃŠøŠ¼ŠµŠ½ŃŃŃ ŃŃŠ¾ Šŗ Š“ŃŃŠ³ŠøŠ¼ ŃŠ»ŠµŠ¼ŠµŠ½Ńам ŃŠøŠæŠ° <code>table-row</code>."
+ },
+ "blockLevelBoxesAndAbsolutelyPositionedBoxesAndGridItems": {
+ "en-US": "block-level boxes, absolutely-positioned boxes, and grid items"
+ },
+ "blockLevelElements": {
+ "de": "Blocklevel Elemente",
+ "en-US": "block-level elements",
+ "fr": "éléments de type bloc",
+ "ja": "ććććÆć¬ćć«č¦ē“ ",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "blockSizeOfContainingBlock": {
+ "de": "Blockgröße des beinhaltenden Blocks",
+ "en-US": "block-size of containing block",
+ "fr": "la taille de bloc du bloc englobant",
+ "ru": "ŃŠ°Š·Š¼ŠµŃ блока, ŃŠ¾Š“ŠµŃŠ¶Š°Ńего ŃŠ»ŠµŠ¼ŠµŠ½Ń"
+ },
+ "boxElements": {
+ "de": "Boxelemente",
+ "en-US": "box elements",
+ "fr": "éléments de boîte",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "byComputedValueType": {
+ "en-US": "by computed value type"
+ },
+ "canonicalOrder": {
+ "de": "Kanonische Reihenfolge",
+ "en-US": "Canonical order",
+ "fr": "Ordre canonique",
+ "ja": "ę£č¦é åŗ",
+ "ru": "ŠŠ°Š½Š¾Š½ŠøŃŠµŃŠŗŠøŠ¹ поŃŃŠ“ок",
+ "zh-CN": "ę£č§é”ŗåŗ"
+ },
+ "childrenOfBoxElements": {
+ "de": "Kindelemente von Boxelementen",
+ "en-US": "children of box elements",
+ "fr": "les éléments fils des éléments de boîte",
+ "ru": "ŠæŠ¾ŃŠ¾Š¼ŠŗŠø Š±Š»Š¾ŃŠ½ŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов"
+ },
+ "color": {
+ "de": "<a href=\"/de/docs/Web/CSS/color_value#Interpolation\">Farbe</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/color_value#Interpolation\" title=\"Values of the <color> CSS data type are interpolated on each of their red, green, blue components, each handled as a real, floating-point number. Note that interpolation of colors happens in the alpha-premultiplied sRGBA color space to prevent unexpected grey colors to appear.\">color</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/color_value#Interpolation\" title=\"Les valeurs de type <couleur> sont interpolées sur chacune des composantes rouge, bleue et verte, considérées chacunes comme un nombre réel à virgule flottante. Notez que l'interpolation des couleurs a lieu dans l'espace couleur sRGBA pré-multiplié pour éviter l'apparition de teintes grises non désirées.\">couleur</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/color_value#Interpolation\" title=\"CSS ć® <color> ćć¼ćæåć®å¤ćÆć赤ćē·ćéć®ććććć®å¤ććØć«ćęµ®åå°ę°ē¹ć®å®ę°ćØćć¦ę±ććć¦č£éććć¾ćććŖććć¢ć«ćć”äŗåę··å sRGBA č²ē©ŗéć§č²ć®č£éćč”ććØćäŗęććć«ē°č²ćē¾ććććØćććć¾ćć\">č²</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/color_value#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <ŃŠ²ŠµŃ> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠæŠ¾ кажГой ŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½Ńе - ŠŗŃŠ°Ńной, Š·ŠµŠ»ŃŠ½Š¾Š¹ Šø Š³Š¾Š»ŃŠ±Š¾Š¹ - как Š²ŠµŃеŃŃŠ²ŠµŠ½Š½Ńе ŃŠøŃла Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹. ŠŠ±ŃŠ°ŃŠøŃе внимание, ŃŃŠ¾ ŠøŠ½ŃŠµŃполŃŃŠøŃ ŃŠ²ŠµŃов ŠæŃоиŃŃ
Š¾Š“ŠøŃ Š² ŃŠ²ŠµŃовом ŠæŃоŃŃŃŠ°Š½ŃŃŠ²Šµ sRGBA, ŃŃŠøŃŃŠ²Š°ŃŃŠµŠ¼ ŠæŃŠ¾Š·ŃŠ°ŃŠ½Š¾ŃŃŃ, Š“Š»Ń ŠæŃŠµŠ“Š¾ŃŠ²ŃŠ°ŃŠµŠ½ŠøŃ ŠæŠ¾ŃŠ²Š»ŠµŠ½ŠøŃ неожиГаннŃŃ
ŃŠµŃŃŃ
ŃŠ²ŠµŃов.\">ŃŠ²ŠµŃ</a>"
+ },
+ "colorPlusThreeAbsoluteLengths": {
+ "de": "eine Farbe plus drei absolute Längen",
+ "en-US": "a color plus three absolute lengths",
+ "fr": "une couleur et trois longueurs absolues",
+ "ja": "č²ćē¶ćć¦ēµ¶åƾēćŖé·ć 3 ć¤",
+ "ru": "ŃŠ²ŠµŃ плŃŃ ŃŃŠø Š°Š±ŃŠ¾Š»ŃŃŠ½ŃŃ
ГлинŃ"
+ },
+ "computedColor": {
+ "de": "berechnete Farbe",
+ "en-US": "computed color",
+ "fr": "couleur calculée",
+ "ja": "č²ć®čØē®å¤",
+ "ru": "вŃŃŠøŃŠ»ŠµŠ½Š½ŃŠ¹ ŃŠ²ŠµŃ"
+ },
+ "consistsOfTwoDimensionKeywords": {
+ "de": "Besteht aus zwei Schlüsselwörtern, einem pro Richtung",
+ "en-US": "Consists of two keywords, one per dimension",
+ "fr": "Deux mots-clés, chacun décrivant une dimension",
+ "ru": "ДоŃŃŠ¾ŠøŃ ŠøŠ· ГвŃŃ
ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², по Š¾Š“Š½Š¾Š¼Ń Š½Š° ŃŠ°Š·Š¼ŠµŃ"
+ },
+ "consistsOfTwoKeywordsForOriginAndOffsets": {
+ "de": "Besteht aus zwei Schlüsselwörtern, die den Ursprung und die beiden Versätze vom Ursprung repräsentieren, wobei beide als absolute Länge angegeben werden (falls eine <length> angegeben wurde), ansonsten einen Prozentwert.",
+ "en-US": "Consists of two keywords representing the origin and two offsets from that origin, each given as an absolute length (if given a <length>), otherwise as a percentage.",
+ "fr": "Deux mots-clés décrivant l'origine et deux représentant les décalages par rapport à cette origine. Chaque valeur est fournie comme une longueur absolue ou comme un pourcentage.",
+ "ru": "ДоŃŃŠ¾ŠøŃ ŠøŠ· ГвŃŃ
ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŃŃŃŠøŃ
Š½Š°ŃŠ°Š»Š¾ ŠŗŠ¾Š¾ŃŠ“ŠøŠ½Š°Ń Šø Гва ŃŠ¼ŠµŃŠµŠ½ŠøŃ Š¾Ń ŃŃŠ¾Š³Š¾ Š½Š°ŃŠ°Š»Š°, кажГое ŠøŠ· ŠŗŠ¾ŃŠ¾ŃŃŃ
заГаŃŃŃŃ ŠŗŠ°Šŗ Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина (ŠµŃŠ»Šø заГана <length>), ŠøŠ½Š°ŃŠµ как ŠæŃоŃенŃ"
+ },
+ "continuous": {
+ "de": "fortlaufend",
+ "en-US": "continuous",
+ "fr": "continu",
+ "ru": "ŠæŃŠ¾Š“Š¾Š»Š¶ŠøŃŠµŠ»ŃŠ½ŃŠ¹"
+ },
+ "createsStackingContext": {
+ "de": "Erstellt <a href=\"/de/docs/Web/CSS/CSS_Positioning/z_index_verstehen/Der_Stackingkontext\">Stapelkontext</a>",
+ "en-US": "Creates <a href=\"/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">stacking context</a>",
+ "fr": "Crée un <a href=\"/fr/docs/Web/CSS/Comprendre_z-index/L'empilement_de_couches\">contexte d'empilement</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">éćåććć³ć³ććć¹ć</a>ć®ēę",
+ "ru": "ДозГаŃŃ <a href=\"/ru/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\">ŠŗŠ¾Š½ŃŠµŠŗŃŃ Š½Š°Š»Š¾Š¶ŠµŠ½ŠøŃ</a>"
+ },
+ "dependsOnLayoutModel": {
+ "de": "hängt vom Layoutmodell ab",
+ "en-US": "depends on layout model",
+ "fr": "dépend du modèle en couches",
+ "ru": "Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š¼Š¾Š“ŠµŠ»Šø Š¼Š°ŠŗŠµŃŠ°"
+ },
+ "dependsOnUserAgent": {
+ "de": "hängt vom User Agent ab",
+ "en-US": "depends on user agent",
+ "fr": "dépend de l'agent utilisateur",
+ "ja": "ć¦ć¼ć¶ćØć¼ćøć§ć³ćć«ä¾å",
+ "ru": "Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š±ŃŠ°ŃŠ·ŠµŃŠ°"
+ },
+ "directChildrenOfElementsWithDisplayMozBoxMozInlineBox": {
+ "de": "Elemente, die direkte Kinder eines Elements mit einem CSS {{cssxref(\"display\")}} Wert von {{cssxref(\"-moz-box\")}} oder {{cssxref(\"-moz-inline-box\")}} oder {{cssxref(\"-webkit-box\")}} oder {{cssxref(\"-webkit-inline-box\")}} sind",
+ "en-US": "elements that are direct children of an element with a CSS {{cssxref(\"display\")}} value of {{cssxref(\"-moz-box\")}} or {{cssxref(\"-moz-inline-box\")}} or {{cssxref(\"-webkit-box\")}} or {{cssxref(\"-webkit-inline-box\")}}",
+ "fr": "éléments qui sont des fils direct d'un élément avec {{cssxref(\"display\")}} qui vaut {{cssxref(\"-moz-box\")}} ou {{cssxref(\"-moz-inline-box\")}} ou {{cssxref(\"-webkit-box\")}} ou {{cssxref(\"-webkit-inline-box\")}}",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, ŃŠ²Š»ŃŃŃŠøŠµŃŃ ŠæŃŃŠ¼Ńми ŠæŠ¾ŃŠ¾Š¼ŠŗŠ°Š¼Šø ŃŠ»ŠµŠ¼ŠµŠ½Ńа ŃŠ¾ ŃŠ²Š¾Š¹ŃŃŠ²Š¾Š¼ {cssxref(\"display\")}} ŃŠ°Š²Š½Ńм {{cssxref(\"-moz-box\")}}, {{cssxref(\"-moz-inline-box\")}}, {{cssxref(\"-webkit-box\")}} или {{cssxref(\"-webkit-inline-box\")}}"
+ },
+ "discrete": {
+ "de": "diskret",
+ "en-US": "discrete",
+ "fr": "discrète",
+ "ja": "åå„"
+ },
+ "eachOfShorthandPropertiesExceptUnicodeBiDiAndDirection": {
+ "de": "wie jede der Kurzschreibweisen Eigenschaften (alle Eigenschaften außer {{cssxref(\"unicode-bidi\")}} und {{cssxref(\"direction\")}})",
+ "en-US": "as each of the properties of the shorthand (all properties but {{cssxref(\"unicode-bidi\")}} and {{cssxref(\"direction\")}})",
+ "fr": "comme pour chaque propriété de la propriété raccourcie (toutes les propriétés sauf {{cssxref(\"unicode-bidi\")}} et {{cssxref(\"direction\")}})",
+ "ru": "как Ń ŠŗŠ°Š¶Š“Š¾Š³Š¾ ŠøŠ· ŠæŠ¾Š“ŃŠ²Š¾Š¹ŃŃŠ² ŃŃŠ¾Š³Š¾ ŃŠ²Š¾Š¹ŃŃŠ²Š° (Š²ŃŠµ ŃŠ²Š¾Š¹ŃŃŠ²Š°, ŠŗŃŠ¾Š¼Šµ {{cssxref(\"unicode-bidi\")}} Šø {{cssxref(\"direction\")}})"
+ },
+ "elementsWithDisplayBoxOrInlineBox": {
+ "de": "Elemente mit einem CSS {{cssxref(\"display\")}} Wert von <code>box</code> oder <code>inline-box</code>",
+ "en-US": "elements with a CSS {{cssxref(\"display\")}} value of <code>box</code> or <code>inline-box</code>",
+ "fr": "éléments avec {{cssxref(\"display\")}} qui vaut <code>box</code> ou <code>inline-box</code>",
+ "ja": "CSS ć® {{cssxref(\"display\")}} ć®å¤ć <code>box</code> ć¾ć㯠<code>inline-box</code> ć§ććč¦ē“ ",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Ń Š·Š½Š°ŃŠµŠ½ŠøŠµŠ¼ ŃŠ²Š¾Š¹ŃŃŠ²Š° {{cssxref(\"display\")}} <code>box</code> или <code>inline-box</code>"
+ },
+ "elementsWithDisplayMarker": {
+ "de": "Elemente mit <code>{{cssxref(\"display\")}}: marker;</code>",
+ "en-US": "elements with <code>{{cssxref(\"display\")}}: marker;</code>",
+ "fr": "éléments avec <code>{{cssxref(\"display\")}}: marker;</code>",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Ń <code>{{cssxref(\"display\")}}: marker;</code>"
+ },
+ "elementsWithDisplayMozBoxMozInlineBox": {
+ "de": "Elemente mit einem CSS {{cssxref(\"display\")}} Wert von <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> oder <code>-webkit-inline-box</code>",
+ "en-US": "elements with a CSS {{cssxref(\"display\")}} value of <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> or <code>-webkit-inline-box</code>",
+ "fr": "éléments dont CSS {{cssxref(\"display\")}} vaut <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> ou <code>-webkit-inline-box</code>",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ ŃŠ¾ Š·Š½Š°ŃŠµŠ½ŠøŠµŠ¼ {{cssxref(\"display\")}}: <code>-moz-box</code>, <code>-moz-inline-box</code>, <code>-webkit-box</code> или <code>-webkit-inline-box</code>"
+ },
+ "elementsWithOverflowNotVisibleAndReplacedElements": {
+ "de": "Elemente, deren {{cssxref(\"overflow\")}} nicht <code>visible</code> ist, und optional ersetzte Elemente, die Bilder oder Videos repräsentieren, und iframes",
+ "en-US": "elements with {{cssxref(\"overflow\")}} other than <code>visible</code>, and optionally replaced elements representing images or videos, and iframes",
+ "fr": "éléments dont {{cssxref(\"overflow\")}} ne vaut pas <code>visible</code> et éventuellement les éléments remplacés qui représentent des images, des vidéos ou des iframes",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Ń {{cssxref(\"overflow\")}} Š¾ŃŠ»ŠøŃŠ½ŃŠ¼ Š¾Ń <code>visible</code>, Šø Š¾ŠæŃŠøŠ¾Š½Š°Š»Ńно Š·Š°Š¼ŠµŠ½ŃемŃе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŃŃŃŠøŠµ ŃŠ¾Š±Š¾Š¹ каŃŃŠøŠ½ŠŗŠø, виГео Šø iframe"
+ },
+ "exclusionElements": {
+ "en-US": "exclusion elements"
+ },
+ "filterList": {
+ "de": "eine <a href=\"/de/docs/Web/CSS/filter#Interpolation\" title=\"Falls beide Filter Funktionslisten gleicher Länge ohne URLs haben, wird jede der Filterfunktionen nach ihren spezifischen Regeln interpoliert. Falls sie unterschiedliche Längen haben, werden die fehlenden äquivalenten Filterfunktionen der längeren Liste unter Verwendung der Standardwerte an das Ende der kürzeren Liste angehängt, anschließend werden alle Filterfunktionen entsprechend ihrer spezifischen Regeln interpoliert. Falls ein Filter 'none' ist, wird er durch die Filterfunktionsliste der anderen unter Verwendung der Standardwerte ersetzt, anschließend werden alle Filterfunktionen entsprechend ihrer spezifischen Regeln interpoliert. Ansonsten wird diskrete Interpolation verwendet.\">Filterfunktionsliste</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/filter#Interpolation\" title=\"If both filters have a function list of same length without URL, each of their filters functions is interpolated according to its specific rules. If they have different lengths, the missing equivalent filter functions from the longer list are added to the end of the shorter list using their default values, then all filter functions are interpolated according to their specific rules. If one filter is 'none', it is replaced with the filter functions list of the other one using the filter function default values, then all filter functions are interpolated according to their specific rules. Otherwise discrete interpolation is used.\">filter function list</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/filter#Interpolation\" title=\"Si les deux filtres ont une liste de fonctions de même longueur sans URL, chaque fonction de filtre est interpolée selon les règles qui lui sont propres. Si elles sont de longueur différente, les dernières fonctions de filtre de la liste la plus longue sont ajoutées à la liste la plus courte avec leurs valeurs par défaut et ensuite, toutes les fonctions de filtre sont interpolées entre elles selon leurs règles spécifiques. Dans les autres cas, c'est une interpolation discrète qui est utilisée.\">liste de fonctions de filtre</a>"
+ },
+ "firstLetterPseudoElementsAndInlineLevelFirstChildren": {
+ "de": "{{cssxref(\"::first-letter\")}} Pseudoelemente und Inline-Level-Elemente, die die ersten Kinder eines Blockcontainers sind",
+ "en-US": "{{cssxref(\"::first-letter\")}} pseudo-elements and inline-level first child of a block container",
+ "fr": "pseudo-éléments {{cssxref(\"::first-letter\")}} et le premier fils, en ligne (<i>inline</i>) d'un conteneur de bloc",
+ "ru": "{{cssxref(\"::first-letter\")}} ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Šø ŠæŠµŃŠ²Ńе ŃŃŃŠ¾ŃŠ½ŃŠµ ŠæŠ¾ŃŠ¾Š¼ŠŗŠø блока"
+ },
+ "flexContainers": {
+ "de": "flexible Container",
+ "en-US": "flex containers",
+ "fr": "conteneurs flexibles",
+ "ru": "flex-ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŃ"
+ },
+ "flexItemsAndAbsolutelyPositionedFlexContainerChildren": {
+ "de": "flexible Elemente und absolut positionierte Flexcontainerkinder",
+ "en-US": "flex items and absolutely-positioned flex container children",
+ "fr": "éléments flexibles, ainsi que les enfants absolument positionnés de conteneurs flexibles",
+ "ru": "flex-ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Šø Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾-ŠæŠ¾Š·ŠøŃŠøŃŠ¾Š²Š°Š½ŃŠµ ŠæŠ¾ŃŠ¾Š¼ŠŗŠø flex-ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃа"
+ },
+ "flexItemsAndInFlowPseudos": {
+ "de": "flexible Elemente einschließlich In-Flow-Pseudo-Elemente",
+ "en-US": "flex items, including in-flow pseudo-elements",
+ "fr": "éléments flexibles, y compris les pseudo-éléments intégrés dans le flux",
+ "ja": "ććć¼å
ć®ēä¼¼č¦ē“ ćå«ććć¬ććÆć¹ć¢ć¤ćć ",
+ "ru": "flex-ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, в ŃŠ¾Š¼ ŃŠøŃле в ŠæŠ¾ŃŠ¾ŠŗŠµ ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½Ńов"
+ },
+ "flexItemsGridItemsAbsolutelyPositionedContainerChildren": {
+ "en-US": "Flex items, grid items, and absolutely-positioned flex and grid container children",
+ "ru": "flex-ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ, grid-ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Šø Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾ ŃŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½ŃŠµ ŠæŠ¾ŃŠ¾Š¼ŠŗŠø flex- Šø grid-ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃов"
+ },
+ "flexItemsGridItemsAndAbsolutelyPositionedBoxes": {
+ "en-US": "flex items, grid items, and absolutely-positioned boxes"
+ },
+ "floats": {
+ "de": "Flusselemente",
+ "en-US": "floats",
+ "fr": "flottants",
+ "ru": "плаваеŃ"
+ },
+ "fontStretch": {
+ "de": "<a href=\"/de/docs/Web/CSS/font-stretch#Interpolation\">Schriftbreite</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/font-stretch#Interpolation\" title=\"Font stretch values are interpolated in discrete steps. The interpolation happens as though the ordered values are equally spaced real numbers; the result is rounded to the nearest value, with values exactly halfway between two values rounded towards the later value, that is the most expanded one.\">font stretch</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/font-stretch#Interpolation\" title=\"Les valeurs de font stretch sont interpolées de façon discrète. L'interpolation s'effectue comme si les valeurs, dans l'ordre, étaient des nombres également distribués : le résultat est arrondi à la valeur la plus proche, les valeurs situées exactement entre deux valeurs sont arrondies à la valeur supérieure.\"><code>font stretch</code></a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/font-stretch#Interpolation\" title=\"Font stretch values are interpolated in discrete steps. The interpolation happens as though the ordered values are equally spaced real numbers; the result is rounded to the nearest value, with values exactly halfway between two values rounded towards the later value, that is the most expanded one.\">font stretch</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/font-stretch#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŃŠøŠ½Ń Š½Š°ŃŠµŃŃŠ°Š½ŠøŃ ŃŃŠøŃŃŠ° ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠæŠ¾ Š“ŠøŃŠŗŃŠµŃŠ½Ńм ŃŠ°Š³Š°Š¼. ŠŠ½ŃŠµŃŠæŠ¾Š»ŃŃŠøŃ ŠæŃŠ¾ŠøŃŃ
Š¾Š“ŠøŃ ŠæŠ¾ ŃŠæŠ¾ŃŃŠ“Š¾ŃŠµŠ½Š½Š¾ ŃŠ°ŃŠæŠ¾Š»Š¾Š¶ŠµŠ½Š½ŃŠ¼ Š·Š½Š°ŃŠµŠ½ŠøŃм в ŠæŃоŃŃŃŠ°Š½ŃŃŠ²Šµ ГейŃŃŠ²ŠøŃŠµŠ»ŃŠ½ŃŃ
ŃŠøŃел; ŃŠµŠ·ŃŠ»ŃŃŠ°Ń окŃŃŠ³Š»ŃеŃŃŃ Šŗ Š±Š»ŠøŠ¶Š°Š¹ŃŠµŠ¼Ń Š·Š½Š°ŃŠµŠ½ŠøŃ, ŃŠ¾Ńно Š¼ŠµŠ¶Š“Ń Š“Š²ŃŠ¼Ń ŃŠ¾ŃеГними Š·Š½Š°ŃениŃми, окŃŃŠ³Š»ŃеŃŃŃ Š² ŃŃŠ¾ŃŠ¾Š½Ń Š±Š¾Š»ŃŃŠµŠ³Š¾ Š·Š½Š°ŃŠµŠ½ŠøŃ, ŠŗŠ¾ŃŠ¾Ńое ŃŠ²Š»ŃеŃŃŃ Š½Š°ŠøŠ±Š¾Š»ŠµŠµ ŃŠøŃоким.\">ŃŠøŃина Š½Š°ŃеŃŃŠ°Š½ŠøŃ ŃŃŠøŃŃŠ°</a>"
+ },
+ "fontWeight": {
+ "de": "<a href=\"/de/docs/Web/CSS/font-weight#Interpolation\">Schriftgewichtung</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/font-weight#Interpolation\" title=\"Font weight values are interpolated via discrete steps (multiples of 100). The interpolation happens in real number space and is converted to an integer by rounding to the nearest multiple of 100, with values halfway between multiples of 100 rounded towards positive infinity.\">font weight</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/font-weight#Interpolation\" title=\"Les valeurs de graisse de police sont interpolées via des étapes discrètes (multiple de 100). L'interpolation a lieu dans un espace de nombres réels et est convertis en un entier arroundi au plus proche multiple de 100, avec les valeurs à mis chemin entre les multiples de 100, arrondies vers l'infini positif.\">graisse de police</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/font-weight#Interpolation\" title=\"Font weight values are interpolated via discrete steps (multiples of 100). The interpolation happens in real number space and is converted to an integer by rounding to the nearest multiple of 100, with values halfway between multiples of 100 rounded towards positive infinity.\">font weight</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/font-weight#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ Š¶ŠøŃŠ½Š¾ŃŃŠø ŃŃŠøŃŃŠ° ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŃŠµŃез ŃŠµŠ»Š¾Šµ ŃŠøŃло Š“ŠøŃŠŗŃŠµŃŠ½ŃŃ
ŃŠ°Š³Š¾Š² (ŃŠ¼Š½Š¾Š¶ŠµŠ½Š½ŃŃ
на 100). ŠŠ½ŃŠµŃŠæŠ¾Š»ŃŃŠøŃ ŠæŃŠ¾ŠøŃŃ
Š¾Š“ŠøŃ Š² ŠæŃŠ¾ŃŃŃŠ°Š½ŃŃŠ²Šµ ГейŃŃŠ²ŠøŃŠµŠ»ŃŠ½ŃŃ
ŃŠøŃел, а полŃŃŠøŠ²ŃееŃŃ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŠæŃŠµŠ¾Š±ŃŠ°Š·ŃŠµŃŃŃ Š² ŃŠµŠ»Š¾Šµ ŠæŃŃŃŠ¼ окŃŃŠ³Š»ŠµŠ½ŠøŃ Го Š±Š»ŠøŠ¶Š°Š¹Ńей ŃŠ¾Ńни, ŃŠ¾ Š·Š½Š°ŃŠµŠ½ŠøŃми ŃŠ¾Ńно Š¼ŠµŠ¶Š“Ń ŃŠ¾ŃеГними Š¼Š½Š¾Š¶ŠøŃелŃми, окŃŃŠ³Š»ŃŠµŠ¼ŃŠ¼Šø в ŃŃŠ¾ŃŠ¾Š½Ń ŠæŠ¾Š»Š¾Š¶ŠøŃŠµŠ»Ńной Š±ŠµŃконеŃноŃŃŠø.\">Š¶ŠøŃŠ½Š¾ŃŃŃ ŃŃŠøŃŃŠ°</a>"
+ },
+ "forLengthAbsoluteValueOtherwisePercentage": {
+ "de": "for {{xref_csslength}} the absolute value, otherwise a percentage",
+ "en-US": "for {{xref_csslength}} the absolute value, otherwise a percentage",
+ "fr": "pour une valeur de type {{xref_csslength}} sa valeur absolue, sinon un pourcentage",
+ "ja": "{{xref_csslength}} ć®å “åćÆēµ¶åƾēćŖå¤ććććŖćć°ćć¼ć»ć³ćć¼ćø",
+ "ru": "Š“Š»Ń {{xref_csslength}} Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, ŠøŠ½Š°ŃŠµ ŠæŃŠ¾ŃенŃ"
+ },
+ "gridContainers": {
+ "de": "Gridcontainer",
+ "en-US": "grid containers",
+ "fr": "conteneurs de grille",
+ "ru": "ŃŠµŃŠ¾ŃŠ½Ńе ŠŗŠ¾Š½ŃейнеŃŃ"
+ },
+ "gridContainersWithMasonryLayout": {
+ "en-US": "Grid containers with masonry layout"
+ },
+ "gridContainersWithMasonryLayoutInTheirBlockAxis": {
+ "en-US": "Grid containers with masonry layout in their block axis"
+ },
+ "gridContainersWithMasonryLayoutInTheirInlineAxis": {
+ "en-US": "Grid containers with masonry layout in their inline axis"
+ },
+ "gridItemsAndBoxesWithinGridContainer": {
+ "de": "Gridelemente und absolut positionierte Boxen, deren beinhaltender Block ein Gridcontainer ist",
+ "en-US": "grid items and absolutely-positioned boxes whose containing block is a grid container",
+ "fr": "élements de grilles et boîtes positionnées de façon absolue dont le bloc englobant est un conteneur de grille",
+ "ru": "ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ ŃŠµŃŠŗŠø Šø Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾-ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½ŃŠµ блоки, наŃ
оГŃŃŠøŠµŃŃ Š² ŃŠµŃŠ¾ŃŠ½Š¾Š¼ ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃе"
+ },
+ "iframeElements": {
+ "en-US": "iframe elements"
+ },
+ "images": {
+ "de": "Bilder",
+ "en-US": "images",
+ "fr": "images",
+ "ru": "ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ"
+ },
+ "inFlowBlockLevelElements": {
+ "de": "in-flow block-level Elemente",
+ "en-US": "in-flow block-level elements",
+ "fr": "éléments de type bloc participant au flux",
+ "ja": "ććć¼ćå
ć«é
ē½®ććććććć¼ćć£ć³ć°ć絶対é
ē½®ććŖććć¦ććŖćå
Øć¦ć®ććććÆć¬ćć«č¦ē“ ",
+ "ru": "Š±Š»Š¾ŃŠ½Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Š² ŠæŠ¾ŃŠ¾ŠŗŠµ"
+ },
+ "inFlowChildrenOfBoxElements": {
+ "de": "Flusskindelemente von Boxelementen",
+ "en-US": "in-flow children of box elements",
+ "fr": "les éléments fils dans le flux des éléments de boîte",
+ "ru": "ŠæŠ¾ŃŠ¾Š¼ŠŗŠø Š±Š»Š¾ŃŠ½ŃŃ
ŃŠ»ŠµŠ¼ŠµŠ½Ńов в ŠæŠ¾ŃŠ¾ŠŗŠµ"
+ },
+ "inlineAxisHorizontalInXUL": {
+ "de": "<code>inline-axis</code> (<code>horizontal</code> in <a href=\"/de/docs/Mozilla/Tech/XUL\">XUL</a>)",
+ "en-US": "<code>inline-axis</code> (<code>horizontal</code> in <a href=\"/en-US/docs/Mozilla/Tech/XUL\">XUL</a>)",
+ "fr": "<code>inline-axis</code> (<code>horizontal</code> en <a href=\"/fr/docs/Mozilla/Tech/XUL\">XUL</a>)",
+ "ru": "<code>inline-axis</code> (<code>horizontal</code> в <a href=\"/ru/docs/Mozilla/Tech/XUL\">XUL</a>)"
+ },
+ "inlineLevelAndTableCellElements": {
+ "de": "Inline- und table-cell Elemente",
+ "en-US": "inline-level and table-cell elements",
+ "fr": "éléments en ligne et à ceux qui sont des cellules de tableau",
+ "ja": "ć¤ć³ć©ć¤ć³ć¬ćć«ćØćć¼ćć«ć»ć«č¦ē“ ",
+ "ru": "ŃŃŃŠ¾ŃŠ½ŃŠ¼ ŃŠ»ŠµŠ¼ŠµŠ½Ńам Šø ŃŃŠµŠ¹ŠŗŠ°Š¼ ŃŠ°Š±Š»ŠøŃ"
+ },
+ "inlineSizeOfContainingBlock": {
+ "de": "Inlinegröße des beinhaltenden Blocks",
+ "en-US": "inline-size of containing block",
+ "fr": "la taille en ligne du bloc englobant",
+ "ru": "вŃŃŃŠ¾ŠµŠ½Š½Ńй ŃŠ°Š·Š¼ŠµŃ ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока"
+ },
+ "integer": {
+ "de": "<a href=\"/de/docs/Web/CSS/integer#Interpolation\">Integer</a>",
+ "en-US": "an <a href=\"/en-US/docs/Web/CSS/integer#Interpolation\" title=\"Values of the <integer> CSS data type are interpolated via integer discrete steps. The calculation is done as if they were real, floating-point numbers and the discrete value is obtained using the floor function.\">integer</a>",
+ "fr": "un <a href=\"/fr/docs/Web/CSS/integer#Interpolation\" title=\"Les valeurs du type <entier> sont interpolées par incrémentation discrète. Le calcul est réalisé comme si les valeurs étaient des nombres réels, en virgule flottante et la valeur discrète est obtenue en utilisant la fonction partie entière.\">entier</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/integer#Interpolation\" title=\"Values of the <integer> CSS data type are interpolated via integer discrete steps. The calculation is done as if they were real, floating-point numbers and the discrete value is obtained using the floor function.\">integer</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/integer#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <ŃŠµŠ»Š¾Šµ ŃŠøŃло> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŃŠµŃез ŃŠµŠ»Š¾Šµ ŃŠøŃло Š“ŠøŃŠŗŃŠµŃŠ½ŃŃ
ŃŠ°Š³Š¾Š². ŠŃŃŠøŃŠ»ŠµŠ½ŠøŃ ŠæŃŠ¾ŠøŠ·Š²Š¾Š“ŃŃŃŃ ŃŠ»Š¾Š²Š½Š¾ наГ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Ńми ŃŠøŃлами Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹, а Š“ŠøŃŠŗŃŠµŃŠ½Ńе Š·Š½Š°ŃŠµŠ½ŠøŃ полŃŃŠ°ŃŃŃŃ Ń ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¼ ŃŃŠ½ŠŗŃŠøŠø floor.\">ŃŠµŠ»Š¾Šµ ŃŠøŃло</a>"
+ },
+ "interactive": {
+ "de": "interaktiv",
+ "en-US": "interactive",
+ "fr": "interactif",
+ "ru": "ŠøŠ½ŃŠµŃŠ°ŠŗŃŠøŠ²Š½Ńй"
+ },
+ "invertForTranslucentColorRGBAOtherwiseRGB": {
+ "de": "Für das Schlüsselwort <code>invert</code> ist der berechnete Wert <code>invert</code>. Für den Farbwert, falls der Wert durchscheinend ist, ist der berechnete Wert der entsprechende <code>rgba()</code> Wert. Falls nicht, ist er der entsprechende <code>rgb()</code> Wert. Das Schlüsselwort <code>transparent</code> wird zu <code>rgba(0,0,0,0)</code>.",
+ "en-US": "For the keyword <code>invert</code>, the computed value is <code>invert</code>. For the color value, if the value is translucent, the computed value will be the <code>rgba()</code> corresponding one. If it isn't, it will be the <code>rgb()</code> corresponding one. The <code>transparent</code> keyword maps to <code>rgba(0,0,0,0)</code>.",
+ "fr": "Pour le mot-clé <code>invert</code>, la valeur calculée est <code>invert</code>. Pour la valeur de la couleur, si la valeur est transparente, la valeur calculée sera la valeur <code>rgba()</code> correspondante. S'il n'y en a pas, ce sera la valeur <code>rgb()</code> correspondante. Le mot-clé <code>transparent</code> correspondra à <code>rgba(0,0,0,0)</code>.",
+ "ja": "ćć¼ćÆć¼ć <code>invert</code> ćęå®ććććØčØē®å¤ć <code>invert</code>ćč²ćęå®ććććØćåéęćŖććčØē®å¤ćÆććć«äøč“ćć<code>rbga()</code> ć§ćäøéęćŖććććć«äøč“ćć <code>rgb()</code>ććć¼ćÆć¼ć <code>transparent</code> 㯠<code>rgba(0,0,0,0)</code> ć«ćććććć¾ć",
+ "ru": "ŠŠ»Ń ŠŗŠ»ŃŃŠµŠ²Š¾Š³Š¾ ŃŠ»Š¾Š²Š° <code>invert</code>, Š·Š½Š°ŃŠµŠ½ŠøŠµ - <code>invert</code>. ŠŠ»Ń Š·Š½Š°ŃŠµŠ½ŠøŃ ŃŠ²ŠµŃа, ŠµŃŠ»Šø Š·Š½Š°ŃŠµŠ½ŠøŠµ ŠøŠ¼ŠµŠµŃ ŠæŃŠ¾Š·ŃŠ°ŃŠ½Š¾ŃŃŃ, ŃŠ¾Š¾ŃвеŃŃŃŠ²ŠµŠ½Š½Š¾, Š·Š½Š°ŃŠµŠ½ŠøŠµ Š±ŃŠ“ŠµŃ ŃŠµŃез <code>rgba()</code>. ŠŃли ŃŃŠ¾ не ŃŠ°Šŗ, ŃŃŠ¾ Š±ŃŠ“ŠµŃ <code>rgb()</code>. ŠŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>transparent</code> Š¾ŃŠ¾Š±ŃажаеŃŃŃ, как <code>rgba(0,0,0,0)</code>."
+ },
+ "invertOrCurrentColor": {
+ "de": "<code>invert</code> für Browser, die es unterstützen, <code>currentColor</code> für die anderen",
+ "en-US": "<code>invert</code>, for browsers supporting it, <code>currentColor</code> for the other",
+ "fr": "<code>invert</code>, pour les navigateurs le supportant, <code>currentColor</code> pour les autres",
+ "ja": "ćć©ć¦ć¶ć¼ć対åæćć¦ććć° <code>invert</code>ćććć§ćŖććć° <code>currentColor</code>",
+ "ru": "<code>invert</code> Š“Š»Ń Š±ŃŠ°ŃŠ·ŠµŃŠ¾Š² ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŃŃŠøŃ
ŃŃŠ¾, <code>currentColor</code> Š“Š»Ń Š¾ŃŃŠ°Š»ŃнŃŃ
"
+ },
+ "keywordOrNumericalValueBolderLighterTransformedToRealValue": {
+ "de": "das Schlüsselwort oder der numerische Wert wie angegeben, wobei <code>bolder</code> und <code>lighter</code> in einen realen Wert umgewandelt werden",
+ "en-US": "the keyword or the numerical value as specified, with <code>bolder</code> and <code>lighter</code> transformed to the real value",
+ "fr": "le mot-clé ou la valeur numérique, comme spécifié, transformé en la valeur réelle avec <code>bolder</code> et <code>lighter</code>",
+ "ru": "ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ или ŃŠøŃловое Š·Š½Š°Ńение, Ń <code>bolder</code> Šø <code>lighter</code>, ŃŃŠ°Š½ŃŃŠ¾ŃмиŃŃŠµŠ¼ŠøŃŃ Š² ГейŃŃŠ²ŠøŃŠµŠ»ŃŠ½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ"
+ },
+ "keywordPlusIntegerIfDigits": {
+ "de": "angegebenes Schlüsselwort plus Ganzzahl, falls 'digits'",
+ "en-US": "specified keyword, plus integer if 'digits'",
+ "fr": "le mot-clé spécifié suivi d'un entier si 'digits'",
+ "ja": "ęå®ććććć¼ćÆć¼ćć'digits' ć®å “åćÆē¶ćć¦ę“ę°",
+ "ru": "ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾, плŃŃ ŃŠµŠ»Ńе ŃŠøŃла, ŠµŃŠ»Šø ŃŠøŃŃŃ"
+ },
+ "length": {
+ "de": "<a href=\"/de/docs/Web/CSS/length#Interpolation\">Längenangabe</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/length#Interpolation\" title=\"Values of the <length> CSS data type are interpolated as real, floating-point numbers.\">length</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/longueur#Interpolation\" title=\"Les valeurs du type <longueur> sont interpolées comme des nombres réels à virgule flottante.\">longueur</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/length#Interpolation\" title=\"Values of the <length> CSS data type are interpolated as real, floating-point numbers.\">length</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/length#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <Глина> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Ńе ŃŠøŃла Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹.\">Глина</a>"
+ },
+ "lengthAbsolutePercentageAsSpecifiedOtherwiseAuto": {
+ "de": "falls als Länge angegeben, die zugehörige absolute Länge; falls als Prozentwert angegeben, der angegebene Wert; ansonsten <code>auto</code>",
+ "en-US": "if specified as a length, the corresponding absolute length; if specified as a percentage, the specified value; otherwise, <code>auto</code>",
+ "fr": "si spécifié par une longueur, la valeur absolue correspondante; si spécifié par un pourcentage, la valeur telle que spécifiée; sinon, <code>auto</code>",
+ "ja": "é·ćć§ęå®ććććØēøå½ćć絶対ēćŖé·ćććć¼ć»ć³ćć¼ćøćØćć¦ęå®ććććØęå®å¤ććć仄å¤ć§ćÆ auto",
+ "ru": "ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Š¾ как Глина - Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина; ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Š¾ как ŠæŃоŃенŃŃ - заГанное Š·Š½Š°Ńение; в ŠæŃоŃивном ŃŠ»ŃŃŠ°Šµ <code>auto</code>"
+ },
+ "lengthOrPercentageBeforeKeywordIfBothPresent": {
+ "de": "die Länge oder der Prozentwert vor dem Schlüsselwort, falls beide vorhanden sind",
+ "en-US": "the length or percentage before the keyword, if both are present",
+ "fr": "la longueur ou le pourcentage avant le mot-clé si les deux sont présents",
+ "ru": "Глина или ŠæŃоŃенŃŃ ŠæŠµŃŠµŠ“ ŠŗŠ»ŃŃŠµŠ²Ńм ŃŠ»Š¾Š²Š¾Š¼, ŠµŃŠ»Šø ŠæŃŠøŃŃŃŃŃŠ²ŃŃŃ Š¾Š±Š°"
+ },
+ "lengthOrPercentageBeforeKeywords": {
+ "de": "Die Länge oder der Prozentwert vor den Schlüsselwörtern, falls beide angegeben wurden. Falls mehrere Schlüsselwörter angegeben wurden, erscheinen sie in derselben Reihenfolge, wie in der formellen Grammatik angegeben.",
+ "en-US": "The length or percentage before the keywords, if both are present. If several keywords are present, they appear in the same order as their appearance in the formal grammar.",
+ "fr": "La longueur ou le pourcentage avant les mots-clés, si les deux sont présents. Si plusieurs mots-clés sont présents, ils apparaissent dans le même ordre que dans la grammaire formelle.",
+ "ru": "ŠŠ»ŠøŠ½Š° или ŠæŃŠ¾ŃŠµŠ½Ń Го ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², ŠµŃŠ»Šø ŠæŃŠøŃŃŃŃŃŠ²ŃŃŃ Š¾Š±Š°. ŠŃли ŠæŃŠøŃŃŃŃŃŠ²ŃŃŃ Š½ŠµŃŠŗŠ¾Š»Ńко ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², они ŠæŠ¾ŃŠ²Š»ŃŃŃŃŃ Š² ŃŠ¾Š¼ же поŃŃŠ“ке, как Šø в ŃŠ¾ŃŠ¼Š°Š»ŃŠ½Š¾Š¹ Š³ŃŠ°Š¼Š¼Š°Ńике."
+ },
+ "lengthsAsPercentages": {
+ "en-US": "The lengths may be specified as percentages"
+ },
+ "listEachItemConsistingOfAbsoluteLengthPercentageAndOrigin": {
+ "de": "Eine Liste, bei der jeder Eintrag aus einem Versatz besteht, der durch eine Kombination aus absoluter Länge und einem Prozentsatz plus einem Ursprungsschlüsselwort definiert wird",
+ "en-US": "A list, each item consisting of: an offset given as a combination of an absolute length and a percentage, plus an origin keyword",
+ "fr": "Une liste dont chaque élément se comompose d'un décalage (exprimé comme la combinaison d'une longueur absolue et d'un pourcentage) et d'un mot-clé pour l'origine",
+ "ru": "Š”ŠæŠøŃŠ¾Šŗ, ŠŗŠ°Š¶Š“ŃŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠŗŠ¾ŃŠ¾Ńого ŃŠ¾ŃŃŠ¾ŠøŃ ŠøŠ·: ŃŠ¼ŠµŃениŃ, Ганного ŠŗŠ¾Š¼Š±ŠøŠ½Š°Ńией Š°Š±ŃолŃŃŠ½Š¾Š¹ Š“Š»ŠøŠ½Ń Šø ŠæŃŠ¾ŃŠµŠ½ŃŠ¾Š² плŃŃ ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾"
+ },
+ "listEachItemHasTwoKeywordsOnePerDimension": {
+ "de": "eine Liste, wobei jedes Element aus zwei Schlüsselwörtern besteht, eins pro Dimension",
+ "en-US": "a list, each item consisting of two keywords, one per dimension",
+ "fr": "une liste dont chaque élément consiste en deux mots-clé, un par dimension",
+ "ru": "ŃŠæŠøŃŠ¾Šŗ, ŠŗŠ°Š¶Š“ŃŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠŗŠ¾ŃŠ¾Ńого ŃŠ¾Š“ŠµŃŠ¶ŠøŃ 2 ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š²Š°, по Š¾Š“Š½Š¾Š¼Ń Š½Š° ŃŠ°Š·Š¼ŠµŃ"
+ },
+ "listEachItemTwoKeywordsOriginOffsets": {
+ "de": "a list, each item consisting of two keywords representing the origin undtwo offsets from that origin, each given as an absolute length (if given a {{xref_csslength}}), otherwise as a percentage",
+ "en-US": "a list, each item consisting of two keywords representing the origin and two offsets from that origin, each given as an absolute length (if given a {{xref_csslength}}), otherwise as a percentage",
+ "fr": "une liste dont chaque élément consiste en deux mots-clé représentant l'origine et deux offsets depuis cette origine, chacun étant une longueur absolue (si spécifié comme une {{xref_csslength}}), ou un pourcentage",
+ "ru": "ŃŠæŠøŃŠ¾Šŗ, ŠŗŠ°Š¶Š“ŃŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠŗŠ¾ŃŠ¾Ńого ŃŠ¾ŃŃŠ¾ŠøŃ ŠøŠ· ГвŃŃ
ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², ŠæŃŠµŠ“ŃŃŠ°Š²Š»ŃŃŃŠøŃ
Š½Š°ŃŠ°Š»Š¾ ŠŗŠ¾Š¾ŃŠ“ŠøŠ½Š°Ń Šø Гва ŃŠ¼ŠµŃŠµŠ½ŠøŃ Š¾Ń ŃŃŠ¾Š³Š¾ Š½Š°ŃŠ°Š»Š°, кажГое ŠøŠ· ŠŗŠ¾ŃŠ¾ŃŃŃ
заГаŃŃŃŃ Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š¹ Глиной (ŠµŃŠ»Šø Гано {{xref_csslength}}), ŠøŠ½Š°ŃŠµ как ŠæŃоŃенŃŃ"
+ },
+ "listItems": {
+ "de": "Listenelemente",
+ "en-US": "list items",
+ "fr": "éléments de liste",
+ "ja": " ćŖć¹ćé
ē®",
+ "ru": "ŃŠæŠøŃŠ¾Šŗ ŃŠ»ŠµŠ¼ŠµŠ½Ńов"
+ },
+ "listSeparator": {
+ "de": ", ",
+ "en-US": ", ",
+ "fr": ", ",
+ "ja": "ć",
+ "ru": ", "
+ },
+ "logicalHeightOfContainingBlock": {
+ "de": "logische Höhe des beinhaltenden Blocks",
+ "en-US": "logical-height of containing block",
+ "fr": "hauteur logique du bloc englobant",
+ "ru": "Š»Š¾Š³ŠøŃŠµŃŠŗŠ°Ń Š²ŃŃŠ¾Ńа ŠŗŠ¾Š½ŃейнеŃа"
+ },
+ "logicalWidthOfContainingBlock": {
+ "de": "logische Breite des beinhaltenden Blocks",
+ "en-US": "logical-width of containing block",
+ "fr": "largeur logique du bloc englobant",
+ "ru": "Š»Š¾Š³ŠøŃŠµŃŠŗŠ°Ń Š²ŃŃŠ¾Ńа ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока"
+ },
+ "lpc": {
+ "de": "$1$, <a href=\"/de/docs/Web/CSS/percentage#Interpolation\">Prozentsatz</a> oder <a href=\"/de/docs/Web/CSS/calc\"><code>calc()</code></a>;",
+ "en-US": "$1$, <a href=\"/en-US/docs/Web/CSS/percentage#Interpolation\" title=\"Values of the <percentage> CSS data type are interpolated as real, floating-point numbers.\">percentage</a> or calc();",
+ "fr": "$1$, <a href=\"/fr/docs/Web/CSS/percentage#Interpolation\" title=\"Les valeurs du type <pourcentage> sont interpolées comme des nombres réels à virgule flottante.\">pourcentage</a> ou calc() ;",
+ "ja": "$1$ ć¾ć㯠<a href=\"/ja/docs/Web/CSS/percentage#Interpolation\" title=\"Values of the <percentage> CSS data type are interpolated as real, floating-point numbers.\">percentage</a>, calc();",
+ "ru": "$1$, <a href=\"/ru/docs/Web/CSS/percentage#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <ŠæŃŠ¾ŃенŃŃ> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Ńе ŃŠøŃла Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹.\">ŠæŃŠ¾ŃенŃŃ</a> или calc();"
+ },
+ "lpcNote": {
+ "de": " wenn beides Längenwerte sind, werden sie als Längenwerte gehandhabt. Wenn beides Prozentsätze sind, werden sie als Prozentsätze gehandhabt. Ansonsten werden beide Werte wie in einer <code>calc()</code> Funktion addiert (Wird ggf. zu Null). Und bei diesen <code>calc()</code> Funktionen wird jede Hälfte als Realzahl interpoliert. ",
+ "en-US": " when both values are lengths, they are interpolated as lengths; when both values are percentages, they are interpolated as percentages; otherwise, both values are converted into a <code>calc()</code> function that is the sum of a length and a percentage (each possibly zero), and these <code>calc()</code> functions have each half interpolated as real numbers. ",
+ "fr": " quand les deux valeurs sont des longueurs, elles sont interpolées comme des longueurs ; quand les deux valeurs sont des pourcentages, elles sont interpolées comme des pourcentages ; sinon, les deux valeurs sont converties dans une fonction <code>calc()</code> qui est la somme d'une longueur et d'un pourcentage (chaque valeur pouvant être à zéro), et cette fonction <code>calc()</code> interpole chaque moitié comme un nombre réel. ",
+ "ja": "ćäø”ę¹ć®å¤ć length ć®å “åćÆćlength å¤ćØćć¦č£å®ććć¾ććäø”ę¹ć®å¤ć percentage ć®å “åćÆćpercentage å¤ćØćć¦č£å®ććć¾ćććć仄å¤ć®å “åćÆćäø”ę¹ć®å¤ć calc() é¢ę°ć«ć³ć³ćć¼ććććlength 㨠percentage ć®åčØć«ćŖćć¾ć (ć¾ććÆåå¤ć 0)ćććć¦ććććć® <code>calc()</code> é¢ę°ćÆćććććååćć¤č£å®ćććå®ę°ćęć”ć¾ć",
+ "ru": " когГа оба Š·Š½Š°ŃŠµŠ½ŠøŃ ŃŠ²Š»ŃŃŃŃŃ Š“Š»ŠøŠ½Š°Š¼Šø, они ŠøŠ½ŃеŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ ГлинŃ; когГа оба Š·Š½Š°ŃŠµŠ½ŠøŃ ŃŠ²Š»ŃŃŃŃŃ ŠæŃŠ¾ŃŠµŠ½ŃŠ°Š¼Šø, они ŠøŠ½ŃеŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ ŠæŃŠ¾ŃенŃŃ; в оŃŃŠ°Š»ŃнŃŃ
ŃŠ»ŃŃŠ°ŃŃ
, оба Š·Š½Š°ŃŠµŠ½ŠøŃ ŠæŃŠµŠ¾Š±ŃазŃŃŃŃŃ ŃŃŠ½ŠŗŃией <code>calc()</code> в ŃŃŠ¼Š¼Ń Š“Š»ŠøŠ½Ń Šø ŠæŃŠ¾ŃŠµŠ½ŃŠ° (ŠŗŠ°Š¶Š“ŃŠ¹ ŠøŠ· ниŃ
Š¼Š¾Š¶ŠµŃ Š±ŃŃŃ ŃŠ°Š²ŠµŠ½ Š½ŃŠ»Ń), а Š·Š°Ńем ŃŃŠ° ŃŃŠ½ŠŗŃŠøŃ ŠøŠ½ŃŠµŃполиŃŃŠµŃ кажГŃŃ ŠæŠ¾Š»Š¾Š²ŠøŠ½Ń ŠŗŠ°Šŗ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Ńе ŃŠøŃла."
+ },
+ "maskElements": {
+ "de": "{{SVGElement(\"mask\")}} Elemente",
+ "en-US": "{{SVGElement(\"mask\")}} elements",
+ "fr": "les éléments {{SVGElement(\"mask\")}}",
+ "ru": "{{SVGElement(\"mask\")}} ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "maxZoomFactor": {
+ "en-US": "The largest allowed zoom factor. A zoom factor of 100% corresponds to no zooming. Larger values zoom in. Smaller values zoom out."
+ },
+ "media": {
+ "de": "Medien",
+ "en-US": "Media",
+ "fr": "Média",
+ "ja": "ć”ćć£ć¢",
+ "pt-BR": "Midia",
+ "ru": "ŠŃŠ¾Š±ŃŠ°Š¶ŠµŠ½ŠøŠµ",
+ "zh-CN": "éēØåŖä½"
+ },
+ "minZoomFactor": {
+ "en-US": "The smallest allowed zoom factor. A zoom factor of 100% corresponds to no zooming. Larger values zoom in. Smaller values zoom out."
+ },
+ "multicolElements": {
+ "de": "mehrspaltige Elemente",
+ "en-US": "multicol elements",
+ "fr": "éléments sur plusieurs colonnes",
+ "ja": "ꮵēµćæč¦ē“ ",
+ "ru": "Š¼ŃŠ»ŃŃŠøŠŗŠ¾Š»Š¾Š½Š¾ŃŠ½ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "multiColumnElementsFlexContainersGridContainers": {
+ "en-US": "multi-column elements, flex containers, grid containers",
+ "ja": "ꮵēµćæč¦ē“ , ćć¬ććÆć¹ć³ć³ććć¼, ć°ćŖććć³ć³ććć¼"
+ },
+ "multilineFlexContainers": {
+ "de": "mehrzeilige flexible Container",
+ "en-US": "multi-line flex containers",
+ "fr": "conteneurs flexibles multi-lignes",
+ "ru": "Š¼ŃŠ»ŃŃŠøŃŃŃŠ¾ŃŠ½ŃŠµ flex-ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŃ"
+ },
+ "no": {
+ "de": "Nein",
+ "en-US": "no",
+ "fr": "non",
+ "ja": "ćŖć",
+ "pt-BR": "não",
+ "ru": "неŃ",
+ "zh-CN": "å¦"
+ },
+ "noneButOverriddenInUserAgentCSS": {
+ "de": "<code>none</code> (aber dieser Wert wird im User Agent CSS überschrieben)",
+ "en-US": "<code>none</code> (but this value is overridden in the user agent CSS)",
+ "fr": "<code>none</code> (cette valeur est surchargée par le CSS de l'agent utilisateur)",
+ "ru": "<code>none</code> (но ŃŃŠ¾ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŠæŠµŃŠµŠ·Š°ŠæŠøŃано в Š“ŠµŃŠ¾Š»Ńном CSS Š±ŃŠ°ŃŠ·ŠµŃŠ°)"
+ },
+ "noneOrImageWithAbsoluteURI": {
+ "de": "<code>none</code> oder das Bild mit absoluter URI",
+ "en-US": "<code>none</code> or the image with its URI made absolute",
+ "fr": "<code>none</code> ou l'image avec son URI rendue absolue",
+ "ja": "<code>none</code> ć¾ććÆē»åć®ēµ¶åƾē URI",
+ "ru": "<code>none</code> или ŠøŠ·Š¾Š±Ńажение Ń Š°Š±ŃŠ¾Š»ŃŃŠ½Ńм URI"
+ },
+ "nonReplacedBlockAndInlineBlockElements": {
+ "de": "nicht ersetzte Blocklevel Elemente und nicht ersetzte Inlineblock Elemente",
+ "en-US": "non-replaced block-level elements and non-replaced inline-block elements",
+ "fr": "les éléments de bloc non remplacés et les éléments en bloc en ligne et en bloc (inline-block)",
+ "ja": "éē½®ęććććÆć¬ćć«č¦ē“ ćØéē½®ęć¤ć³ć©ć¤ć³ććććÆč¦ē“ ",
+ "ru": "не Š·Š°Š¼ŠµŠ½ŃемŃе Š±Š»Š¾ŃнŃе Šø inline-block ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "nonReplacedBlockElements": {
+ "de": "Nicht ersetzte <code>block</code>-Elemente (außer <code>table</code>-Elemente), <code>table-cell</code>- oder <code>inline-block</code>-Elemente",
+ "en-US": "non-replaced <code>block</code> elements (except <code>table</code> elements), <code>table-cell</code> or <code>inline-block</code> elements",
+ "fr": "éléments non-remplacés de type <code>block</code> ou <code>table</code>, ou éléments de type <code>table-cell</code> ou <code>inline-block</code>",
+ "ja": "éē½®ęććććÆč¦ē“ ļ¼ćć¼ćć«č¦ē“ ćé¤ćļ¼ććć¼ćć«ć»ć«ćć¤ć³ć©ć¤ć³ććććÆč¦ē“ ",
+ "ru": "не Š·Š°Š¼ŠµŠ½ŃемŃе Š±Š»Š¾ŃнŃе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ (ŠŗŃŠ¾Š¼Šµ ŃŠ»ŠµŠ¼ŠµŠ½Ńов <code>table</code>), <code>table-cell</code> или <code>inline-block</code> ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "nonReplacedElements": {
+ "en-US": "non-replaced elements"
+ },
+ "nonReplacedInlineElements": {
+ "de": "nicht ersetzte Inlineelemente",
+ "en-US": "non-replaced inline elements",
+ "fr": "les éléments en ligne non remplacés",
+ "ja": "éē½®ęć¤ć³ć©ć¤ć³č¦ē“ ",
+ "ru": "не Š·Š°Š¼ŠµŠ½ŃемŃе ŃŃŃŠ¾ŃŠ½ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "noPracticalInitialValue": {
+ "de": "Es gibt keinen praktischen Initialwert dafür.",
+ "en-US": "There is no practical initial value for it.",
+ "fr": "Il n'y a pas de valeur initiale pour cela.",
+ "ru": "ŠŠ° ŠæŃŠ°ŠŗŃике Š½Š°ŃалŃного Š·Š½Š°ŃŠµŠ½ŠøŃ неŃ"
+ },
+ "noPracticalMedia": {
+ "de": "Es gibt kein praktisches Medium dafür.",
+ "en-US": "There is no practical media for it.",
+ "fr": "Il n'y a pas de média pour cela.",
+ "ru": "ŠŠ»Ń ŃŃŠ¾Š³Š¾ Š½ŠµŃ ŠæŃŠ°ŠŗŃŠøŃŠµŃкого ŠæŃименениŃ."
+ },
+ "normalizedAngle": {
+ "de": "normalisierter Winkel",
+ "en-US": "normalized angle",
+ "fr": "angle normalisé",
+ "ru": "Š½Š¾ŃŠ¼Š°Š»ŠøŠ·Š¾Š²Š°Š½Š½Ńй ŃŠ³Š¾Š»"
+ },
+ "normalOnElementsForPseudosNoneAbsoluteURIStringOrAsSpecified": {
+ "de": "Bei Elementen ist der berechnete Wert immer <code>normal</code>. Falls bei {{cssxref(\"::before\")}} und {{cssxref(\"::after\")}} <code>normal</code> angegeben ist, ist der berechnete Wert <code>none</code>. Ansonsten, für URI Werte die absolute URI; für <code>attr()</code> Werte der resultierende String; für andere Schlüsselwörter wie angegeben.",
+ "en-US": "On elements, always computes to <code>normal</code>. On {{cssxref(\"::before\")}} and {{cssxref(\"::after\")}}, if <code>normal</code> is specified, computes to <code>none</code>. Otherwise, for URI values, the absolute URI; for <code>attr()</code> values, the resulting string; for other keywords, as specified.",
+ "fr": "Sur les éléments, le résultat du calcul est toujours <code>normal</code>. Sur {{cssxref(\"::before\")}} et {{cssxref(\"::after\")}}, si <code>normal</code> est spécifié, cela donnera <code>none</code>. Sinon, pour les valeurs d'URI, on aura l'URI absolue ; pour les valeurs <code>attr()</code>, on aura la chaine résultante ; pour les autres mots-clé, ce sera comme spécifié.",
+ "ja": "éåøøč¦ē“ ć§ä½æććććØåøøć« <code>normal</code>ć{{cssxref(\"::before\")}} åć³ {{cssxref(\"::after\")}} ć§ćÆ: <code>normal</code> ć®ęå®ćććć°čØē®å¤ćÆ <code>none</code>ćęå®ććŖććć°ć<ul><li>URI å¤ćÆć絶対ē URI ćØćŖć</li><li><code>attr()</code> å¤ćÆćčØē®å¤ć®ęååćØćŖć</li><li>ćć®ä»ć®ćć¼ćÆć¼ćć«ć¤ćć¦ćÆęå®ć©ćć</li></ul>",
+ "ru": "ŠŠ° ŃŠ»ŠµŠ¼ŠµŠ½ŃаŃ
Š²ŃŠµŠ³Š“а вŃŃŠøŃŠ»ŃŠµŃŃŃ ŠŗŠ°Šŗ <code>normal</code>. ŠŠ° {{cssxref(\"::before\")}} Šø {{cssxref(\"::after\")}}, ŠµŃŠ»Šø <code>normal</code> ŃŠŗŠ°Š·Š°Š½Š¾, ŠøŠ½ŃŠµŃŠæŃŠµŃŠøŃŃŠµŃŃŃ ŠŗŠ°Šŗ <code>none</code>. ŠŠ½Š°Ńе, Š“Š»Ń Š·Š½Š°ŃŠµŠ½ŠøŠ¹ URI, Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š³Š¾ URI; Š“Š»Ń Š·Š½Š°ŃŠµŠ½ŠøŠ¹ <code>attr()</code> - ŃŠµŠ·ŃŠ»ŃŃŠøŃŃŃŃŠ°Ń ŃŃŃŠ¾ŠŗŠ°; Š“Š»Ń Š“ŃŃŠ³ŠøŃ
ŠŗŠ»ŃŃŠµŠ²ŃŃ
ŃŠ»Š¾Š², как ŃŠŗŠ°Š·Š°Š½Š¾."
+ },
+ "notAnimatable": {
+ "en-US": "Not animatable"
+ },
+ "number": {
+ "de": "<a href=\"/de/docs/Web/CSS/number#Interpolation\">Nummer</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/number#Interpolation\" title=\"Values of the <number> CSS data type are interpolated as real, floating-point, numbers.\">number</a>",
+ "fr": "un <a href=\"/fr/docs/Web/CSS/nombre#Interpolation\" title=\"Les valeurs du type <nombre> sont interpolées comme des nombres réels, en virgule flottante.\">nombre</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/number#Interpolation\" title=\"Values of the <number> CSS data type are interpolated as real, floating-point, numbers.\">number</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/number#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <ŃŠøŃло> ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠŗŠ°Šŗ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Ńе ŃŠøŃла Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹.\">ŃŠøŃло</a>"
+ },
+ "numberOrLength": {
+ "en-US": "either number or length",
+ "ru": "ŃŠøŃло или Глина"
+ },
+ "oneOrTwoValuesLengthAbsoluteKeywordsPercentages": {
+ "de": "Einer oder mehrere Werte, mit absolut gemachten Längen und Schlüsselwörtern zu Prozentwerten umgewandelt",
+ "en-US": "One or two values, with length made absolute and keywords translated to percentages",
+ "fr": "Une ou deux valeurs, avec la longueur en absolue et les mots-clés traduits en pourcentage",
+ "ru": "ŠŠ“но или Гва Š·Š½Š°ŃениŃ, Ń Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š¹ Глинной Šø ŠŗŠ»ŃŃŠµŠ²Ńми ŃŠ»Š¾Š²Š°Š¼Šø, ŠæŠµŃŠµŠ²ŠµŠ“ŃŠ½Š½Ńми в ŠæŃоŃенŃŃ"
+ },
+ "oneToFourPercentagesOrAbsoluteLengthsPlusFill": {
+ "de": "ein bis vier Prozentwert(e) (wie angegeben) oder absolute Länge(n) plus das Schlüsselwort <code>fill</code>, falls angegeben",
+ "en-US": "one to four percentage(s) (as specified) or absolute length(s), plus the keyword <code>fill</code> if specified",
+ "fr": "un à quatre pourcentages, comme spécifiés, ou des longueurs absolues, suivis par le mot-clé <code>fill</code> si spécifié",
+ "ja": "1 ć¤ćć 4 ć¤ć®ćć¼ć»ć³ćć¼ćøå¤ļ¼ęå®å¤ļ¼ć¾ććÆēµ¶åƾēćŖé·ććęå®ććć¦ććć°ē¶ćć¦ćć¼ćÆć¼ć <code>fill</code>",
+ "ru": "оГно Šŗ ŃŠµŃŃŃŃŠ¼ ŠæŃŠ¾ŃŠµŠ½ŃŠ°Š¼ (как ŃŠŗŠ°Š·Š°Š½Š¾) или Š°Š±ŃолŃŃŠ½Š¾Š¹ Глине(ам), плŃŃ ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>fill</code>, ŠµŃŠ»Šø ŃŠŗŠ°Š·Š°Š½Š¾"
+ },
+ "optimumMinAndMaxValueOfAbsoluteLengthPercentageOrNormal": {
+ "de": "ein optimaler, minimaler und maximaler Wert, jeder bestehend aus entweder einer absoluten Länge, einem Prozentwert oder dem Schlüsselwort <code>normal</code>",
+ "en-US": "an optimum, minimum, and maximum value, each consisting of either an absolute length, a percentage, or the keyword <code>normal</code>",
+ "fr": "trois valeurs, optimale, minimale et maximale, chacune consitant en une longueur absolue, un pourcentage ou le mot-clé <code>normal</code>",
+ "ja": "ćććć絶対ęå®ć® lengthćpercentageććć¼ćÆć¼ć <code>normal</code>ć®ććććć§ćććęé©å¤ćęå°å¤ćę大å¤",
+ "ru": "Š¾ŠæŃŠøŠ¼Š°Š»Ńное, Š¼ŠøŠ½ŠøŠ¼Š°Š»ŃŠ½Š¾Šµ Šø Š¼Š°ŠŗŃŠøŠ¼Š°Š»Ńное Š·Š½Š°ŃениŃ, кажГое ŠøŠ· ŠŗŠ¾ŃŠ¾ŃŃŃ
Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина, ŠæŃŠ¾ŃенŃŃ ŠøŠ»Šø ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>normal</code>"
+ },
+ "optimumValueOfAbsoluteLengthOrNormal": {
+ "de": "ein optimaler Wert, der entweder aus einer absoluten Länge oder dem Schlüsselwort <code>normal</code> besteht",
+ "en-US": "an optimum value consisting of either an absolute length or the keyword <code>normal</code>",
+ "fr": "une valeur optimale consistant en une longueur absolue ou <code>normal</code>",
+ "ru": "Š¾ŠæŃŠøŠ¼Š°Š»Ńное Š·Š½Š°Ńение ŃŠ¾ŃŃŠ¾ŠøŃ ŠøŠ· Š°Š±ŃŠ¾Š»ŃŃŠ½Š¾Š¹ Š“Š»ŠøŠ½Ń ŠøŠ»Šø ŠŗŠ»ŃŃŠµŠ²Š¾Š³Š¾ ŃŠ»Š¾Š²Š° <code>normal</code>"
+ },
+ "orderOfAppearance": {
+ "de": "Reihenfolge des Auftretens in der formalen Grammatik der Werte",
+ "en-US": "order of appearance in the formal grammar of the values",
+ "fr": "l'ordre d'apparition dans la grammaire formelle des valeurs",
+ "ja": "å½¢å¼ęę³ć«ćććå¤ć®åŗē¾é ",
+ "ru": "поŃŃŠ“ок ŠæŠ¾ŃŠ²Š»ŠµŠ½ŠøŃ в ŃŠ¾ŃŠ¼Š°Š»ŃŠ½Š¾Š¹ Š³ŃŠ°Š¼Š¼Š°Ńике Š·Š½Š°Ńений"
+ },
+ "percentageAsSpecifiedAbsoluteLengthOrNone": {
+ "de": "der Prozentwert wie angegeben oder die absolute Länge oder <code>none</code>",
+ "en-US": "the percentage as specified or the absolute length or <code>none</code>",
+ "fr": "le pourcentage comme spécifié ou la longueur absolue ou le mot-clé <code>none</code>",
+ "ja": "ęå®ććććć¼ć»ć³ćć¼ćøå¤ć¾ććÆēµ¶åƾēćŖé·ććć¾ć㯠<code>none</code>",
+ "ru": "ŠæŃŠ¾ŃенŃŃ, как ŃŠŗŠ°Š·Š°Š½Ń, Š°Š±ŃŠ¾Š»ŃŃŠ½Š°Ń Глина или <code>none</code>"
+ },
+ "percentageAsSpecifiedOrAbsoluteLength": {
+ "de": "der Prozentwert wie angegeben oder die absolute Länge",
+ "en-US": "the percentage as specified or the absolute length",
+ "fr": "le pourcentage tel que spécifé ou une longeur absolue",
+ "ja": "ęå®ććććć¼ć»ć³ćć¼ćøå¤ć¾ććÆēµ¶åƾēćŖé·ć",
+ "ru": "ŠæŃŠ¾ŃенŃ, как ŃŠŗŠ°Š·Š°Š½, или аблоŃŃŃŠ½Š°Ń Глина"
+ },
+ "percentageAutoOrAbsoluteLength": {
+ "de": "ein Prozentwert oder <code>auto</code> oder die absolute Länge",
+ "en-US": "a percentage or <code>auto</code> or the absolute length",
+ "fr": "un pourcentage ou <code>auto</code> ou une longueur absolue",
+ "ja": "ćć¼ć»ć³ćć¼ćøćautoć絶対ēćŖé·ćć®ćććć",
+ "ru": "ŠæŃŠ¾ŃенŃ, <code>auto</code> или Š°Š±ŃолŃŃŠ½Š°Ń Глина"
+ },
+ "percentageOrAbsoluteLengthPlusKeywords": {
+ "de": "der Prozentwert wie angegeben oder die absolute Länge plus Schlüsselwörter, falls angegeben",
+ "en-US": "the percentage as specified or the absolute length, plus any keywords as specified",
+ "fr": "le pourcentage tel que spécifié ou la longueur absolue, ainsi que les mots-clé comme spécifiés",
+ "ja": "ęå®ććććć¼ć»ć³ćć¼ćøå¤ć¾ććÆēµ¶åƾēćŖé·ććē¶ćć¦ęå®ćććä»»ęć®ę°ć®ćć¼ćÆć¼ć",
+ "ru": "ŠæŃŠ¾ŃенŃ, как ŃŠŗŠ°Š·Š°Š½ или Š°Š±ŃолŃŃŠ½Š°Ń Глина, а ŃŠ°ŠŗŠ¶Šµ Š»ŃŠ±Ńе ŠŗŠ»ŃŃŠµŠ²Ńе ŃŠ»Š¾Š²Š°"
+ },
+ "percentages": {
+ "de": "Prozentwerte",
+ "en-US": "Percentages",
+ "fr": "Pourcentages",
+ "ja": "ćć¼ć»ć³ćć¼ćø",
+ "ru": "ŠŃŠ¾ŃŠµŠ½ŃŃ"
+ },
+ "percentagesOrLengthsFollowedByFill": {
+ "de": "die Prozentwerte oder Längen gefolgt vom Schlüsselwort <code>fill</code>",
+ "en-US": "the percentages or lengths, eventually followed by the keyword <code>fill</code>",
+ "fr": "les pourcentages ou les longueurs, éventuellement suivis par le mot-clé <code>fill</code>",
+ "ru": "ŠæŃŠ¾ŃенŃŃ ŠøŠ»Šø ГлинŃ, в ŠŗŠ¾Š½ŠµŃном ŃŃŠµŃе, ŃŠ»ŠµŠ“ŃŠµŃ ŠŗŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>fill</code>"
+ },
+ "perGrammar": {
+ "de": "nach Grammatik",
+ "en-US": "per grammar",
+ "fr": "selon la grammaire",
+ "ja": "ę§ęéć"
+ },
+ "position": {
+ "de": "<a href=\"/de/docs/Web/CSS/number#Interpolation\" title=\"Werte des <position> Datentyps werden unabhängig für Abszisse und Ordinate interpoliert. Da die Geschwindigkeit für beide durch dieselbe <timing-function> bestimmt wird, wird der Punkt einer Linie folgen.\">Position</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/position_value#Interpolation\" title=\"Values of the <position> data type are interpolated independently for the abscissa and ordinate. As the speed is defined by the same <timing-function> for both, the point will move following a line.\">position</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/position_value#Interpolation\" title=\"Les valeurs de type <position> sont interpolées indépendamment pour les abscisses et pour les ordonnées. La vitesse est définie par la même <timing-function>, le point se déplacera donc suivant une ligne.\">position</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/position_value#Interpolation\" title=\"ŠŠ½Š°Ńении ŃŠøŠæŠ° ГаннŃŃ
<ŠæŠ¾Š·ŠøŃŠøŃ> ŠøŠ½ŃŠµŃполизŃŃŃŃŃ Š½ŠµŠ·Š°Š²ŠøŃŠøŠ¼Š¾ как абŃŃŠøŃŃŠ° или Š¾ŃŠ“ŠøŠ½Š°ŃŠ°. Š”ŠŗŠ¾ŃŠ¾ŃŃŃ Š¾ŠæŃŠµŠ“ŠµŠ»ŃŠµŃŃŃ ŠæŠ¾ оГной <Š²ŃŠµŠ¼ŠµŠ½Š½Š¾Š¹ ŃŃŠ½ŠŗŃŠøŠø> Š“Š»Ń Š¾Š±Š¾ŠøŃ
ŠŗŠ¾Š¾ŃŠ“инаŃ, ŃŠ¾Ńка Š±ŃŠ“ŠµŃ Š“Š²ŠøŠ³Š°ŃŃŃŃ ŃŠ»ŠµŠ“ŃŃ Š»ŠøŠ½ŠøŠø.\">ŠæŠ¾Š·ŠøŃŠøŃ</a>"
+ },
+ "positionedElements": {
+ "de": "positionierte Elemente",
+ "en-US": "positioned elements",
+ "fr": "éléments positionnés",
+ "ja": "é
ē½®ćććč¦ē“ ",
+ "ru": "ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½Š½ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "rectangle": {
+ "de": "<a href=\"/de/docs/Web/CSS/shape#Interpolation\">Rechteck</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/shape#Interpolation\" title=\"Values of the <shape> CSS data type which are rectangles are interpolated over their top, right, bottom and left component, each treated as a real, floating-point number.\">rectangle</a>",
+ "fr": "un <a href=\"/fr/docs/Web/CSS/forme#Interpolation\" title=\"Valeurs de type CSS <forme> qui ont des rectangles interpolés sur leurs composantes haute, droite, basse et gauche dont chacune est traitée comme un nombre flottant réel.\">rectangle</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/shape#Interpolation\" title=\"Values of the <shape> CSS data type which are rectangles are interpolated over their top, right, bottom and left component, each treated as a real, floating-point number.\">rectangle</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/shape#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠøŠæŠ° ГаннŃŃ
CSS <ŃŠøŠ³ŃŃŠ°>, ŠŗŠ¾ŃŠ¾ŃŃŠµ ŃŠ²Š»ŃŃŃŃŃ ŠæŃŃŠ¼Š¾ŃŠ³Š¾Š»ŃŠ½ŠøŠŗŠ°Š¼Šø, ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ ŠæŠ¾ ŠøŃ
веŃŃ
ней, ŠæŃŠ°Š²Š¾Š¹, нижней Šø левой ŠŗŠ¾Š¼ŠæŠ¾Š½ŠµŠ½Ńе, ŠŗŠ°Š¶Š“Š°Ń ŠøŠ· ŠŗŠ¾ŃŠ¾ŃŃŃ
ŃŃŠ°ŠŗŃŃŠµŃŃŃ ŠŗŠ°Šŗ Š²ŠµŃŠµŃŃŠ²ŠµŠ½Š½Š¾Šµ ŃŠøŃло или Ń ŠæŠ»Š°Š²Š°ŃŃŠµŠ¹ запŃŃŠ¾Š¹.\">ŠæŃŃŠ¼Š¾ŃŠ³Š¾Š»ŃŠ½ŠøŠŗ</a>"
+ },
+ "referToBorderBox": {
+ "de": "beziehen sich auf die Rahmenbox des Elements",
+ "en-US": "refer to the element’s border box",
+ "fr": "fait référence à l'élément <code>border box</code>",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ Š³ŃŠ°Š½ŠøŃе ŃŠ»ŠµŠ¼ŠµŠ½Ńа"
+ },
+ "referToContainingBlockHeight": {
+ "de": "bezieht sich auf die Höhe des äußeren Elements",
+ "en-US": "refer to the height of the containing block",
+ "fr": "se rapporte à la hauteur du bloc contenant",
+ "ja": "å
å«ććććÆć®é«ć",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ вŃŃŠ¾Ńе ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока"
+ },
+ "referToDimensionOfBorderBox": {
+ "de": "bezieht sich auf die Größe der Border-Box",
+ "en-US": "refer to the corresponding dimension of the border box",
+ "fr": "se rapporte à la dimension correspondance de la boîte de bordure",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ¾Š¾ŃвеŃŃŃŠ²ŃŃŃŠµŠ¼Ń ŃŠ°Š·Š¼ŠµŃŃ Š³ŃŠ°Š½ŠøŃŃ ŃŠ»ŠµŠ¼ŠµŠ½Ńа"
+ },
+ "referToDimensionOfContentArea": {
+ "de": "beziehen sich auf die entsprechende Dimension des Inhaltsbereichs",
+ "en-US": "refer to corresponding dimension of the content area",
+ "fr": "fait référence à la dimension correspondante de la zone de contenu",
+ "ja": "該å½ććć³ć³ćć³ćé åć®åÆøę³ćåē
§",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ¾Š¾ŃŠ²ŠµŃŠ²ŃŃŃŠµŠ¼Ń ŃŠ°Š·Š¼ŠµŃŃ Š¾Š±Š»Š°ŃŃŠø ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾"
+ },
+ "referToElementFontSize": {
+ "de": "bezieht sich auf die Schriftgröße des Elternelements",
+ "en-US": "refer to the font size of the element itself",
+ "fr": "se rapporte à la taille de la police de l'élément lui-même",
+ "ja": "č¦ē“ čŖčŗ«ć®ćć©ć³ććµć¤ćŗ",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ°Š·Š¼ŠµŃŃ ŃŃŠøŃŃŠ° ŃŠ°Š¼Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńа"
+ },
+ "referToFlexContainersInnerMainSize": {
+ "de": "bezieht sich auf die Hauptgröße des Flexcontainers",
+ "en-US": "refer to the flex container's inner main size",
+ "fr": "se rapporte à la principale taille interne du conteneur flexible",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ внŃŃŃŠµŠ½Š½ŠµŠ¼Ń ŃŠ°Š·Š¼ŠµŃŃ Š³Š»Š°Š²Š½Š¾Š³Š¾ flex-ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃа"
+ },
+ "referToHeightOfBackgroundPositioningAreaMinusBackgroundImageHeight": {
+ "de": "bezieht sich auf die Höhe des Hintergrundpositionsbereichs abzüglich der Höhe des Hintergrundbilds",
+ "en-US": "refer to height of background positioning area minus height of background image",
+ "fr": "fait référence à la hauteur de la zone de positionement de l'arrière-plan moins la hauteur de l'image d'arrière-plan",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ вŃŃŠ¾Ńе облаŃŃŠø ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠ¾Š½Š° минŃŃ Š²ŃŃŠ¾Ńа ŃŠ¾Š½Š¾Š²Š¾Š³Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ"
+ },
+ "referToHeightOfInitialViewport": {
+ "de": "beziehen sich auf die Höhe des ursprünglichen Viewports",
+ "en-US": "refer to the height of the initial viewport",
+ "fr": "fait référence à la hauteur de la zone d'affichage (<i>viewport</i>) initiale",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ вŃŃŠ¾Ńе ŠøŠ·Š½Š°ŃалŃной облаŃŃŠø ŠæŃŠ¾ŃмоŃŃŠ°"
+ },
+ "referToLineBoxWidth": {
+ "en-US": "calculated with respect to the width of the line box"
+ },
+ "referToLineHeight": {
+ "de": "bezieht sich auf die {{cssxref(\"line-height\")}} des Elements selbst",
+ "en-US": "refer to the {{cssxref(\"line-height\")}} of the element itself",
+ "fr": "se rapporte à la hauteur de ligne de l'élément lui-même",
+ "ja": "č¦ē“ čŖčŗ«ć®č”ć®é«ć",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ {{cssxref(\"line-height\")}} ŃŠ°Š¼Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńа"
+ },
+ "referToParentElementsFontSize": {
+ "de": "bezieht sich auf die Schriftgröße des Elternelements",
+ "en-US": "refer to the parent element's font size",
+ "fr": "se rapporte à la taille de la police de l'élément parent",
+ "ja": " 親č¦ē“ ć® font-size",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ°Š·Š¼ŠµŃŃ ŃŃŠøŃŃŠ° ŃŠ¾Š“ŠøŃŠµŠ»Ń"
+ },
+ "referToReferenceBoxWhenSpecifiedOtherwiseBorderBox": {
+ "en-US": "refer to reference box when specified, otherwise border-box"
+ },
+ "referToSizeOfBackgroundPositioningAreaMinusBackgroundImageSize": {
+ "de": "bezieht sich auf die Größe des Hintergrundpositionsbereichs abzüglich der Größe des Hintergrundbilds; die Größe bezieht sich auf die vertikalen und horizontalen Verschiebungen",
+ "en-US": "refer to the size of the background positioning area minus size of background image; size refers to the width for horizontal offsets and to the height for vertical offsets",
+ "fr": "se rapporte à la taille de la zone de positionnement de l'arrière-plan, moins la taille de l'image; la taille se rapporte à la largeur pour les décalages horizontaux et à la hauteur pour les décalages verticaux",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ°Š·Š¼ŠµŃŃ Š¾Š±Š»Š°ŃŃŠø ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠ¾Š½Š° минŃŃ ŃŠ°Š·Š¼ŠµŃ ŃŠ¾Š½Š¾Š²Š¾Š³Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ; ŃŠ°Š·Š¼ŠµŃ - ŃŠøŃина Š³Š¾ŃŠøŠ·Š¾Š½ŃŠ°Š»ŃнŃŃ
ŃŠ¼ŠµŃений Šø вŃŃŠ¾Ńа веŃŃŠøŠŗŠ°Š»ŃнŃŃ
"
+ },
+ "referToSizeOfBorderImage": {
+ "de": "bezieht sich auf die Größe des Bildes",
+ "en-US": "refer to the size of the border image",
+ "fr": "se rapporte à la taille de l'image de bordure",
+ "ja": "ćć¼ćć¼ē»åć®ćµć¤ćŗ",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ°Š·Š¼ŠµŃŃ ŃŠ°Š¼ŠŗŠø ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ"
+ },
+ "referToSizeOfBoundingBox": {
+ "de": "bezieht sich auf die Größe der äußeren Box",
+ "en-US": "refer to the size of bounding box",
+ "fr": "se rapporte à la taille de la boîte de l'élément",
+ "ja": "bounding box ć®ćµć¤ćŗ",
+ "ru": "ŃŃŃŠ»Š°ŠµŃŃŃ Š½Š° ŃŠ°Š·Š¼ŠµŃ Š¾Š³ŃŠ°Š½ŠøŃŠøŃŠµŠ»Ńной ŃŠ°Š¼ŠŗŠø"
+ },
+ "referToSizeOfElement": {
+ "de": "beziehen sich auf die Größe der Box selbst",
+ "en-US": "refer to the size of the box itself",
+ "fr": "fait référence à la taille de la boîte elle-même",
+ "ru": "ŃŃŃŠ»Š°ŠµŃŃŃ Š½Š° ŃŠ°Š·Š¼ŠµŃ ŃŠ°Š¼Š¾Š³Š¾ блока"
+ },
+ "referToSizeOfFont": {
+ "de": "ja, beziehen sich auf die entsprechende Größe der Schriftart",
+ "en-US": "yes, refer to the corresponding size of the text font",
+ "fr": "oui, indique la taille correspondante de la police de texte",
+ "ru": "Га, Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ¾Š¾ŃвеŃŃŃŠ²ŃŃŃŠµŠ¼Ń ŃŠ°Š·Š¼ŠµŃŃ ŃŃŠøŃŃŠ° ŃŠµŠŗŃŃŠ°"
+ },
+ "referToSizeOfMaskBorderImage": {
+ "en-US": "refer to size of the mask border image"
+ },
+ "referToSizeOfMaskPaintingArea": {
+ "de": "beziehen sich auf die Größe des Maskenzeichenbereichs minus der Größe des Maskenebenenbildes (siehe den Text zu {{cssxref(\"background-position\")}})",
+ "en-US": "refer to size of mask painting area minus size of mask layer image (see the text for {{cssxref(\"background-position\")}})",
+ "fr": "fait référence à la taille du masque pour la zone de pointure moins la taille du masque pour la taille de l'image (voir {{cssxref(\"background-position\")}})",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠ°Š·Š¼ŠµŃŃ Š¼Š°ŃŠŗŠø облаŃŃŠø ŃŠøŃŠ¾Š²Š°Š½ŠøŃ Š¼ŠøŠ½ŃŃ ŃŠ°Š·Š¼ŠµŃ Š¼Š°ŃŠŗŠø ŃŠ»Š¾Ń ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ (ŃŠ¼Š¾ŃŃŠøŃе ŃŃŠ°ŃŃŃ Š¾ {{cssxref(\"background-position\")}})"
+ },
+ "referToTotalPathLength": {
+ "de": "beziehen sich auf die Gesamtlänge des Pfads",
+ "en-US": "refer to the total path length",
+ "fr": "se rapporte à la longueur totale du chemin",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ Š¾Š±ŃŠµŠ¹ Глине ŠæŃŃŠø"
+ },
+ "referToWidthAndHeightOfElement": {
+ "de": "beziehen sich auf Breite und Höhe des Elements",
+ "en-US": "refer to width and height of element itself",
+ "fr": "se rapporte à la largeur et à la hauteur de l'élément lui-même",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠøŃине Šø вŃŃŠ¾Ńе ŃŠ°Š¼Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ńа"
+ },
+ "referToWidthOfAffectedGlyph": {
+ "de": "bezieht sich auf die Breite des jeweiligen Zeichens",
+ "en-US": "refer to the width of the affected glyph",
+ "fr": "se rapporte à la largeur du glyphe concerné",
+ "ja": "ä½ēØćć glyph ć® width",
+ "ru": "Š·Š°Š²ŠøŃŠøŃ Š¾Ń ŃŠøŃŠøŠ½Ń ŃŠøŠ¼Š²Š¾Š»Š°"
+ },
+ "referToWidthOfBackgroundPositioningAreaMinusBackgroundImageHeight": {
+ "de": "bezieht sich auf die Breite des Hintergrundpositionsbereichs abzüglich der Höhe des Hintergrundbilds",
+ "en-US": "refer to width of background positioning area minus height of background image",
+ "fr": "fait référence à la largeur de la zone de positionement de l'arrière-plan moins la hauteur de l'image d'arrière-plan",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠøŃине облаŃŃŠø ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠ¾Š½Š° минŃŃ Š²ŃŃŠ¾Ńа ŃŠ¾Š½Š¾Š²Š¾Š³Š¾ ŠøŠ·Š¾Š±ŃŠ°Š¶ŠµŠ½ŠøŃ"
+ },
+ "referToWidthOfContainingBlock": {
+ "de": "bezieht sich auf die Breite des äußeren Elements",
+ "en-US": "refer to the width of the containing block",
+ "fr": "se rapporte à la largeur du bloc contenant",
+ "ja": "å
å«ććććÆć®å¹
",
+ "ru": "ŃŃŃŠ»Š°ŠµŃŃŃ Š½Š° ŃŠøŃŠøŠ½Ń ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока"
+ },
+ "referToWidthOfInitialViewport": {
+ "de": "beziehen sich auf die Breite des ursprünglichen Viewports",
+ "en-US": "refer to the width of the initial viewport",
+ "fr": "fait référence à la largeur de la zone d'affichage (<i>viewport</i>) initiale",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ ŃŠøŃине ŠøŠ·Š½Š°ŃалŃной облаŃŃŠø ŠæŃŠ¾ŃмоŃŃŠ°"
+ },
+ "referToWidthOrHeightOfBorderImageArea": {
+ "de": "bezieht sich auf die Größe des Rahmenbildbereichs",
+ "en-US": "refer to the width or height of the border image area",
+ "fr": "se rapporte à la largeur ou la hauteur de la zone de l'image de bordure",
+ "ru": "Š¾ŃŠ½Š¾ŃŃŃŃŃ Šŗ вŃŃŠ¾Ńе или ŃŠøŃине облаŃŃŠø ŃŠ°Š¼ŠŗŠø каŃŃŠøŠ½ŠŗŠø"
+ },
+ "regardingHeightOfGeneratedBoxContainingBlockPercentages0": {
+ "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, wird der Prozentwert wie <code>0</code> behandelt.",
+ "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is treated as <code>0</code>.",
+ "es": "Se refiere a la altura del bloque contenedor.",
+ "fr": "Le poucentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné , la valeur du pourcentage est traitée comme si elle valait <code>0</code>.",
+ "ja": "ćć¼ć»ć³ćć¼ćøćÆćēęćććÆć¹ć®å
å«ććććÆć®é«ććåŗęŗć«čØē®ććć¾ćć å
å«ććććÆć®é«ććę示ēć«å®ē¾©ćććļ¼ćć®å “åć³ć³ćć³ćć®é«ćć«ä¾åćć¾ćļ¼ćć®č¦ē“ ć絶対ä½ē½®ęå®ććć¦ććŖććŖćććć¼ć»ć³ćć¼ćøå¤ćÆ 0 ćØćć¦ę±ććć¾ćć",
+ "ru": "ŠŃŠ¾ŃŠµŠ½Ń Š“Š»Ń Š³ŠµŠ½ŠµŃŠøŃŃŠµŠ¼Š¾Š³Š¾ блока ŃŠ°ŃŃŃŠøŃŃŠ²Š°ŠµŃŃŃ ŠæŠ¾ Š¾ŃŠ½Š¾ŃŠµŠ½ŠøŃ Šŗ вŃŃŠ¾Ńе ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока. ŠŃли вŃŃŠ¾Ńа ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока не заГана ŃŠ²Š½Š¾ (Ń.е. Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š²ŃŃŠ¾ŃŃ ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾), Šø ŃŃŠ¾Ń ŃŃŠ¾Ń ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃован не Š°Š±ŃолŃŃŠ½Š¾, ŠæŃŠ¾ŃŠµŠ½ŃŠ½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŠøŠ½ŃŠµŃŠæŃŠµŃŠøŃŃŠµŃŃŃ ŠŗŠ°Šŗ <code>0</code>."
+ },
+ "regardingHeightOfGeneratedBoxContainingBlockPercentagesNone": {
+ "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, wird der Prozentwert wie <code>none</code> behandelt.",
+ "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is treated as <code>none</code>.",
+ "fr": "Le pourcentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné, la valeur du pourcentage est traitée comme si elle valait <code>none</code>.",
+ "ja": " ćć¼ć»ć³ćć¼ćøćÆćēęćććÆć¹ć®å
å«ććććÆć®é«ććåŗęŗć«čØē®ććć¾ćć å
å«ććććÆć®é«ććę示ēć«å®ē¾©ćććļ¼ć³ć³ćć³ćć®é«ćć«ä¾åćć¾ćļ¼ćć®č¦ē“ ć絶対ä½ē½®ęå®ććć¦ććŖććŖćććć¼ć»ć³ćć¼ćøå¤ćÆ none ćØćć¦ę±ććć¾ćć",
+ "ru": "ŠŃŠ¾ŃŠµŠ½Ń Š“Š»Ń Š³ŠµŠ½ŠµŃŠøŃŃŠµŠ¼Š¾Š³Š¾ блока ŃŠ°ŃŃŃŠøŃŃŠ²Š°ŠµŃŃŃ ŠæŠ¾ Š¾ŃŠ½Š¾ŃŠµŠ½ŠøŃ Šŗ вŃŃŠ¾Ńе ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока. ŠŃли вŃŃŠ¾Ńа ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока не заГана ŃŠ²Š½Š¾ (Ń.е. Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š²ŃŃŠ¾ŃŃ ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾), Šø ŃŃŠ¾Ń ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃован не Š°Š±ŃолŃŃŠ½Š¾, ŠæŃŠ¾ŃŠµŠ½ŃŠ½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŠøŠ½ŃŠµŃŠæŃŠµŃŠøŃŃŠµŃŃŃ ŠŗŠ°Šŗ <code>none</code>."
+ },
+ "regardingHeightOfGeneratedBoxContainingBlockPercentagesRelativeToContainingBlock": {
+ "de": "Der Prozentwert wird unter Berücksichtigung der Höhe des die generierte Box beinhaltenden Blocks berechnet. Falls die Höhe des beinhaltenden Blocks nicht explizit angegeben wurde (d. h. sie hängt von der Höhe des Inhalts ab) und dieses Element nicht absolut positioniert ist, ist der berechnete Wert <code>auto</code>. Eine prozentuale Höhe beim Wurzelelement ist relativ zum ursprünglichen beinhaltenden Block.",
+ "en-US": "The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the value computes to <code>auto</code>. A percentage height on the root element is relative to the initial containing block.",
+ "fr": "Le poucentage est par rapport à la hauteur de la boîte générée par le bloc contenant. Si la hauteur du bloc contenant n'est pas explicitement spécifiée (c'est-à-dire qu'elle dépend de la hauteur du contenu), et si cet élément n'est pas absolument positionné, la valeur du pourcentage est traitée comme <code>auto</code> et la hauteur du pourcentage sur l'élément racine est relative au bloc contenant initial.",
+ "ja": "ćć¼ć»ć³ćć¼ćøćÆå
å«ććććÆć®é«ćåŗęŗćå
å«ććććÆć®é«ććę示ćććļ¼ļ¼ć³ć³ćć³ćć®é«ćä¾åć®å “åļ¼ććć®č¦ē“ ć絶対ä½ē½®ęå®ććć¦ććŖććŖććå¤ćÆ <code>auto</code> ć«ćŖćć¾ććć«ć¼ćč¦ē“ ć§é«ćććć¼ć»ć³ćć¼ćøęå®ćććØćåęå
å«ććććÆć«ēøåƾēć«ćŖćć¾ćć",
+ "ru": "ŠŃŠ¾ŃŠµŠ½Ń Š“Š»Ń Š³ŠµŠ½ŠµŃŠøŃŃŠµŠ¼Š¾Š³Š¾ блока ŃŠ°ŃŃŃŠøŃŃŠ²Š°ŠµŃŃŃ ŠæŠ¾ Š¾ŃŠ½Š¾ŃŠµŠ½ŠøŃ Šŗ вŃŃŠ¾Ńе ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока. ŠŃли вŃŃŠ¾Ńа ŃŠ¾Š“ŠµŃŠ¶Š°Ńего блока не заГана ŃŠ²Š½Š¾ (Ń.е. Š·Š°Š²ŠøŃŠøŃ Š¾Ń Š²ŃŃŠ¾ŃŃ ŃŠ¾Š“ŠµŃŠ¶ŠøŠ¼Š¾Š³Š¾), Šø ŃŃŠ¾Ń ŃŃŠ¾Ń ŃŠ»ŠµŠ¼ŠµŠ½Ń ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃован не Š°Š±ŃолŃŃŠ½Š¾, Š·Š½Š°ŃŠµŠ½ŠøŠµ Š±ŃŠ“ŠµŃ <code>auto</code>. ŠŃŠ¾ŃŠµŠ½ŃŠ½Š°Ń Š²ŃŃŠ¾Ńа на ŠŗŠ¾Ńневом ŃŠ»ŠµŠ¼ŠµŠ½Ńе Š¾ŃŠ½Š¾ŃŠøŃелŃна ŠæŠµŃŠ²Š¾Š½Š°ŃŠ°Š»ŃŠ½Š¾Š¼Ń блокŃ."
+ },
+ "relatedAtRule": {
+ "de": "Zugehörige <a href=\"/de/docs/Web/CSS/At-Regel\">@-Regel</a>",
+ "en-US": "Related <a href=\"/en-US/docs/Web/CSS/At-rule\">at-rule</a>",
+ "fr": "En lien avec les <a href=\"/fr/docs/Web/CSS/Règles_%40\">règles @</a>",
+ "ja": "é¢é£ćć <a href=\"/ja/docs/Web/CSS/At-rule\">@č¦å</a>",
+ "ru": "Š”Š²ŃŠ·Š°Š½Š¾ Ń <a href=\"/ru/docs/Web/CSS/At-rule\">@-ŠæŃŠ°Š²ŠøŠ»Š°</a>"
+ },
+ "relativeToBackgroundPositioningArea": {
+ "de": "bezieht sich auf den jeweiligen Bereich",
+ "en-US": "relative to the background positioning area",
+ "fr": "relatifs à la zone de positionnement du fond",
+ "ru": "Š¾ŃŠ½Š¾ŃŠøŃŠµŠ»Ńно облаŃŃŠø ŠæŠ¾Š·ŠøŃŠøŠ¾Š½ŠøŃŠ¾Š²Š°Š½ŠøŃ ŃŠ¾Š½Š°"
+ },
+ "relativeToMaskBorderImageArea": {
+ "en-US": "relative to width/height of the mask border image area"
+ },
+ "relativeToScrollContainerPaddingBoxAxis": {
+ "de": "relativ zur gleichen Achse der Innenabstandsbox des Scrollcontainers",
+ "en-US": "relative to same axis of the padding-box of the scroll container",
+ "fr": "relatif au même axe de la <code>padding-box</code> du conteneur d'ascenceur",
+ "ru": "Š¾ŃŠ½Š¾ŃŠøŃŠµŠ»Ńно ŃŠ¾Š¹ же Š¾ŃŠø Šø внŃŃŃŠµŠ½Š½ŠøŃ
оŃŃŃŃŠæŠ¾Š² ŠæŃŠ¾ŠŗŃŃŃŠøŠ²Š°ŠµŠ¼Š¾Š³Š¾ ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃа"
+ },
+ "relativeToTheScrollContainersScrollport": {
+ "en-US": "relative to the scroll container's scrollport"
+ },
+ "repeatableList": {
+ "de": "mehrfache Werte der folgenden Eigenschaften: ",
+ "en-US": "a repeatable list of ",
+ "fr": "une liste répétable de ",
+ "ja": "ć®å復åÆč½ćŖć¹ć",
+ "ru": "ŠæŠ¾Š²ŃŠ¾ŃŃŃŃŠøŠ¹ŃŃ ŃŠæŠøŃŠ¾Šŗ ŠøŠ· "
+ },
+ "repeatableListOfSimpleListOfLpc": {
+ "en-US": "repeatable list of simple list of length, percentage, or calc"
+ },
+ "replacedElements": {
+ "de": "ersetzte Elemente",
+ "en-US": "replaced elements",
+ "fr": "éléments remplacés",
+ "ru": "Š·Š°Š¼ŠµŠ½ŃŠµŠ¼Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "rubyAnnotationsContainers": {
+ "de": "Ruby-Anmerkungscontainer",
+ "en-US": "ruby annotations containers",
+ "fr": "annotations ruby des conteneurs",
+ "ru": "ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŃ ruby-Š°Š½Š½Š¾ŃŠ°Ńий"
+ },
+ "rubyBasesAnnotationsBaseAnnotationContainers": {
+ "de": "Ruby-Basiselemente, Ruby-Anmerkungen, Ruby-Basiscontainer, Ruby-Anmerkungscontainer",
+ "en-US": "ruby bases, ruby annotations, ruby base containers, ruby annotation containers",
+ "fr": "bases ruby, annotations ruby, conteneurs de bases ruby, conteneurs d'annotations ruby",
+ "ru": "Š±Š°Š·Š¾Š²ŃŠµ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ ruby, Š°Š½Š½Š¾ŃŠ°ŃŠøŠø Šŗ ruby, Š±Š°Š·Š¾Š²ŃŠµ ruby ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŃ, ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŃ Š°Š½Š½Š¾ŃŠ°Ńий Šŗ ruby"
+ },
+ "sameAsBoxOffsets": {
+ "de": "wie die Boxoffsets: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} Eigenschaften, mit dem Unterschied, dass die Richtungen logisch sind",
+ "en-US": "same as box offsets: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} properties except that directions are logical",
+ "fr": "identiques aux propriétés qui décalent les boîtes : {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}} sauf que ces directions sont logiques",
+ "ru": "ŃŠ°ŠŗŠ¶Šµ как ŃŠ¼ŠµŃение блоков ŃŠ²Š¾Š¹ŃŃŠ²Š°Š¼Šø: {{cssxref(\"top\")}}, {{cssxref(\"right\")}}, {{cssxref(\"bottom\")}}, {{cssxref(\"left\")}}, ŠŗŃŠ¾Š¼Šµ ŃŠ¾Š³Š¾ Š½Š°ŠæŃŠ°Š²Š»ŠµŠ½ŠøŃ Š»Š¾Š³ŠøŃŠ½Ń"
+ },
+ "sameAsMargin": {
+ "de": "wie bei {{cssxref(\"margin\")}}",
+ "en-US": "same as {{cssxref(\"margin\")}}",
+ "fr": "identique à {{cssxref(\"margin\")}}",
+ "ru": "Ń ŃŠ°ŠŗŠøŠ¼ же {{cssxref(\"margin\")}}"
+ },
+ "sameAsMaxWidthAndMaxHeight": {
+ "de": "wie bei {{cssxref(\"max-width\")}} und {{cssxref(\"max-height\")}}",
+ "en-US": "same as {{cssxref(\"max-width\")}} and {{cssxref(\"max-height\")}}",
+ "fr": "identique à {{cssxref(\"max-width\")}} et à {{cssxref(\"max-height\")}}",
+ "ru": "Ń ŃŠ°ŠŗŠøŠ¼Šø же {{cssxref(\"max-width\")}} Šø {{cssxref(\"max-height\")}}"
+ },
+ "sameAsMinWidthAndMinHeight": {
+ "de": "wie bei {{cssxref(\"min-width\")}} und {{cssxref(\"min-height\")}}",
+ "en-US": "same as {{cssxref(\"min-width\")}} and {{cssxref(\"min-height\")}}",
+ "fr": "identique à {{cssxref(\"min-width\")}} et à {{cssxref(\"min-height\")}}",
+ "ru": "Ń ŃŠ°ŠŗŠøŠ¼Šø же {{cssxref(\"min-width\")}} Šø {{cssxref(\"min-height\")}}"
+ },
+ "sameAsWidthAndHeight": {
+ "de": "wie bei {{cssxref(\"width\")}} und {{cssxref(\"height\")}}",
+ "en-US": "same as {{cssxref(\"width\")}} and {{cssxref(\"height\")}}",
+ "fr": "identique à {{cssxref(\"width\")}} et à {{cssxref(\"height\")}}",
+ "ru": "Ń ŃŠ°ŠŗŠøŠ¼Šø же {{cssxref(\"width\")}} Šø {{cssxref(\"height\")}}"
+ },
+ "scrollContainers": {
+ "de": "Scrollcontainer",
+ "en-US": "scroll containers",
+ "fr": "conteneurs d'ascenseurs",
+ "ja": "ć¹ćÆćć¼ć«ć³ć³ććć¼",
+ "ru": "ŠæŃŠ¾ŠŗŃŃŃŠøŠ²Š°ŠµŠ¼Ńе ŠŗŠ¾Š½ŃейнеŃŃ"
+ },
+ "scrollingBoxes": {
+ "de": "scrollende Boxen",
+ "en-US": "scrolling boxes",
+ "fr": "boîtes défilantes",
+ "ja": "ć¹ćÆćć¼ć«ćććććÆć¹",
+ "ru": "ŠæŃŠ¾ŠŗŃŃŃŠøŠ²Š°ŠµŠ¼Ńе блоки"
+ },
+ "seeProse": {
+ "de": "siehe Text",
+ "en-US": "see prose",
+ "fr": "voir le texte",
+ "ru": "ŃŠ¼Š¾ŃŃŠµŃŃ ŃŠµŠŗŃŃ"
+ },
+ "shadowList": {
+ "de": "eine <a href=\"/de/docs/Web/CSS/box-shadow#Interpolation\" title=\"Die color, x, y, blur und spread (falls anwendbar) Komponenten einer Schattenliste werden unabhängig voneinander interpoliert. Falls sich der inset-Wert irgendeines Schattenpaares der beiden Listen unterscheidet, gilt die gesamte liste als nicht interpolierbar. Falls eine Liste kürzer ist als die andere, wird die kürzere mit transparenten Schatten aufgefüllt, deren Längen alle auf 0 gesetzt sind und deren inset-Wert der längeren Liste entspricht.\">Liste von Schatten</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/box-shadow#Interpolation\" title=\"The color, x, y, blur and spread (if applicable) components of shadow lists are interpolated independently. If the inset value of any shadow pair differs between both lists, the whole list is uninterpolable. If one list is smaller than the other, it gets padded with transparent shadows with all their lengths set to 0 and its inset value matching the longer list.\">shadow list</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/box-shadow#Interpolation\" title=\"Les composantes de couleur, coordonnées x, y, de flou et d'étalement (si applicable) des listes d'ombres sont interpolées indépendamment. Si la valeur inset de n'importe quelle ombre différe entre les deux listes, toute la liste ne pourra pas être interpolée. Si une liste est plus petite qu'une autre, elle sera complétée avec des ombres transparentes dont les longueurs sont nulles et dont les valeurs d'inset correspondent à celles de la liste plus longue.\">liste d'ombres</a>",
+ "ja": "a <a href=\"/ja/docs/Web/CSS/box-shadow#Interpolation\" title=\"å½±ć®ćŖć¹ććÆćč²ć®ęåć xć yć ć¼ććć (é©åć§ććć°) åŗććć®ęåć§åå„ć«č£å®ććć¾ććäø”ę¹ć®ćŖć¹ćć§å½±ć®ēµć® inset ć®å¤ćē°ćŖćå “åćÆććŖć¹ćå
Øä½ćÆč£å®ććć¾ćććäøę¹ć®ćŖć¹ććććäøę¹ććēćå “åćÆć transparent ć®č²ć®å½±ć§č£å®ćććć¹ć¦ć®é·ćć 0 ć§ććć inset (ć®ęē”) ćäøč“ćććć®ćććć°ćććé·ććŖć¹ćć«äøč“ćć¾ćć\">å½±ć®ćŖć¹ć</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/box-shadow#Interpolation\" title=\"ЦвеŃ, абŃŃŠøŃŃŠ°, Š¾ŃŠ“ŠøŠ½Š°ŃŠ°, ŃŠ°Š·Š¼ŃŃŠøŠµ Šø ŃŠ°ŃŠæŃŠ¾ŃŃŃŠ°Š½ŠµŠ½ŠøŠµ (ŠµŃŠ»Šø ŠæŃŠøŠ¼ŠµŠ½ŠµŠ½Š¾) ŃŠæŠøŃŠŗŠ° ŃŠµŠ½ŠµŠ¹ ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ Š½ŠµŠ·Š°Š²ŠøŃŠøŠ¼Š¾. ŠŃли внŃŃŃŠµŠ½Š½ŠµŠµ Š·Š½Š°ŃŠµŠ½ŠøŠµ какой-либо паŃŃ ŃŠµŠ½ŠµŠ¹ ŃŠ°Š·Š»ŠøŃаеŃŃŃ Š² обоиŃ
ŃŠæŠøŃŠŗŠ°Ń
, ŠøŠ½ŃŠµŃŠæŠ¾Š»ŠøŠ·ŃŠµŃŃŃ Š²ŠµŃŃ ŃŠæŠøŃŠ¾Šŗ. ŠŃли оГин ŃŠæŠøŃŠ¾Šŗ менŃŃŠµ оŃŃŠ°Š»ŃнŃŃ
, он Š“Š¾ŠæŠ¾Š»Š½ŃŠµŃŃŃ ŠæŃŠ¾Š·ŃŠ°ŃŠ½Š¾ŃŃŃŃ ŃŠµŠ½ŠµŠ¹ ŃŠ¾ Š²ŃŠµŠ¹ ŠøŃ
Глинной ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½Š½Š¾Š¹ в 0, а его внŃŃŃŠµŠ½Š½ŠµŠµ Š·Š½Š°ŃŠµŠ½ŠøŠµ ŃŠ¾Š¾ŃŠ²ŠµŃŠ²ŃŠµŃ Š“Š»ŠøŠ½Š½Š¾Š¼Ń ŃŠæŠøŃŠŗŃ.\">ŃŠæŠøŃŠ¾Šŗ ŃŠµŠ½ŠµŠ¹</a>"
+ },
+ "simpleList": {
+ "de": "ein einfacher Wert der folgenden Eigenschaften: ",
+ "en-US": "a simple list of ",
+ "fr": "une simple liste de ",
+ "ja": "åē“ćŖćŖć¹ć: ",
+ "ru": "ŠæŃŠ¾ŃŃŠ¾Š¹ ŃŠæŠøŃŠ¾Šŗ ŠøŠ· "
+ },
+ "simpleListOfLpc": {
+ "en-US": "simple list of length, percentage, or calc",
+ "ja": "length, percentage, calc ć®åē“ćŖćŖć¹ć"
+ },
+ "simpleListOfLpcDifferenceLpc": {
+ "en-US": "simple list of length, percentage, or calc, provided the only differences are in the values of the length, percentage, or calc components in the list"
+ },
+ "specifiedIntegerOrAbsoluteLength": {
+ "de": "die angegebene Ganzzahl oder eine absolute Länge",
+ "en-US": "the specified integer or an absolute length",
+ "fr": "l'entier spécifié ou une longueur absolue",
+ "ja": "ęå®ćććę“ę°å¤ć¾ććÆēµ¶åƾēćŖé·ć",
+ "ru": "ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ ŃŠµŠ»Š¾Šµ ŃŠøŃло или Š°Š±ŃолŃŃŠ½Š°Ń Глина"
+ },
+ "specifiedValueClipped0To1": {
+ "de": "der angegebene Wert, auf den Bereich <code>[0,1]</code> abgeschnitten",
+ "en-US": "the specified value, clipped in the range <code>[0,1]</code>",
+ "fr": "la valeur spécifiée, écrêtée à l'intervalle <code>[0,1]</code>",
+ "ja": "ęå®å¤ć<code>[0,1]</code> ć®ēÆå²å
ć«ćÆćŖććććć¾ć",
+ "ru": "ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, Š¾Š±ŃŠµŠ·Š°ŠµŃŃŃ Š“Š¾ Гиапозона <code>[0,1]</code>"
+ },
+ "specifiedValueNumberClipped0To1": {
+ "de": "Derselbe wie der angegebene Wert nachdem die {{cssxref(\"number\")}} auf den Bereich [0.0, 1.0] zugeschnitten wurde.",
+ "en-US": "The same as the specified value after clipping the {{cssxref(\"number\")}} to the range [0.0, 1.0].",
+ "fr": "La même que la valeur spécifiée après avoir écrêté {{cssxref(\"number\")}} dans l'intervalle [0.0, 1.0].",
+ "ru": "Тоже, ŃŃŠ¾ Šø ŃŠŗŠ°Š·Š°Š½Š½Š¾Šµ Š·Š½Š°ŃŠµŠ½ŠøŠµ, ŠæŠ¾ŃŠ»Šµ Š¾Š±ŃŠµŠ·ŠŗŠø {{cssxref(\"number\")}} Го Гиапозона [0.0, 1.0]."
+ },
+ "startOrNamelessValueIfLTRRightIfRTL": {
+ "de": "<code>start</code> oder ein namenloser Wert, der sich wie <code>left</code> verhält, falls {{cssxref(\"direction\")}} den Wert <code>ltr</code> hat, <code>right</code>, falls {{cssxref(\"direction\")}} den Wert <code>rtl</code> hat, falls <code>start</code> nicht vom Browser unterstützt wird.",
+ "en-US": "<code>start</code>, or a nameless value that acts as <code>left</code> if {{cssxref(\"direction\")}} is <code>ltr</code>, <code>right</code> if {{cssxref(\"direction\")}} is <code>rtl</code> if <code>start</code> is not supported by the browser.",
+ "fr": "<code>start</code>, ou une valeur non nommée se comportant comme <code>left</code> si {{cssxref(\"direction\")}} est <code>ltr</code>, <code>right</code> si {{cssxref(\"direction\")}} est <code>rtl</code> si <code>start</code> n'est pas supporté par le navigateur",
+ "ja": "<code>start</code>ć<code>start</code> ććµćć¼ćććŖććć©ć¦ć¶ć§ćÆć{{cssxref(\"direction\", \"ęē« ć®ę¹å\")}}ć <code>ltr</code> ćŖć <code>left</code>ć<code>rtl</code> ćŖć <code>right</code> ćØćć¦åä½ććē”åć®å¤",
+ "ru": "<code>start</code>, или неназванное Š·Š½Š°Ńение, ŠŗŠ¾ŃŠ¾Ńое ГейŃŃŠ²ŃŠµŃ ŠŗŠ°Šŗ <code>left</code>, ŠµŃŠ»Šø {{cssxref(\"direction\")}}: <code>ltr</code> или как <code>right</code>, ŠµŃŠ»Šø {{cssxref(\"direction\")}}: <code>rtl</code>, а ŠµŃли <code>start</code> не ŠæŠ¾Š“Š“ŠµŃŠ¶ŠøŠ²Š°ŠµŃŃŃ Š±ŃŠ°ŃŠ·ŠµŃŠ¾Š¼."
+ },
+ "tableCaptionElements": {
+ "de": "table-caption Elemente",
+ "en-US": "table-caption elements",
+ "fr": "éléments qui sont des légendes de tableaux",
+ "ja": "table-caption č¦ē“ ",
+ "ru": "заголовки ŃŠ°Š±Š»ŠøŃ"
+ },
+ "tableCellElements": {
+ "de": "table-cell Elemente",
+ "en-US": "table-cell elements",
+ "fr": "éléments qui sont des cellules de tableau",
+ "ja": "ćć¼ćć«ć»ć«č¦ē“ ",
+ "ru": "ŃŃŠµŠ¹ŠŗŠø ŃŠ°Š±Š»ŠøŃŃ"
+ },
+ "tableElements": {
+ "de": "<code>table</code>- und <code>inline-table</code>-Elemente",
+ "en-US": "<code>table</code> and <code>inline-table</code> elements",
+ "fr": "des éléments <code>table</code> and <code>inline-table</code>",
+ "ja": "<code>table</code> ććć³ <code>inline-table</code> č¦ē“ ",
+ "ru": "<code>table</code> Šø <code>inline-table</code> ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "textElements": {
+ "de": "Textelemente",
+ "en-US": "text elements",
+ "fr": "éléments textes",
+ "ja": "ććć¹ćč¦ē“ ",
+ "ru": "ŃŠµŠŗŃŃŠ¾Š²Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "textFields": {
+ "de": "Textfelder",
+ "en-US": "text fields",
+ "fr": "champs de texte",
+ "ja": "ććć¹ććć£ć¼ć«ć",
+ "ru": "ŃŠµŠŗŃŃŠ¾Š²Ńе полŃ"
+ },
+ "transform": {
+ "de": "Transformation",
+ "en-US": "a transform",
+ "fr": "une transformation",
+ "ja": "transform",
+ "ru": "ŃŃŠ°Š½ŃŃŠ¾ŃŠ¼Š°ŃŠøŃ"
+ },
+ "transformableElements": {
+ "de": "transformierbare Elemente",
+ "en-US": "transformable elements",
+ "fr": "éléments transformables",
+ "ja": "å¤å½¢åÆč½č¦ē“ ",
+ "pt-BR": "qualquer elemento transformavel",
+ "ru": "ŃŃŠ°Š½ŃŃŠ¾ŃмиŃŃŠµŠ¼Ńе ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ"
+ },
+ "translucentValuesRGBAOtherwiseRGB": {
+ "de": "Falls der Wert durchscheinend ist, ist der berechnete Wert der entsprechende <code>rgba()</code> Wert. Falls nicht, ist er der entsprechende <code>rgb()</code> Wert. Das <code>transparent</code> Schlüsselwort wird zu <code>rgb(0,0,0)</code>.",
+ "en-US": "If the value is translucent, the computed value will be the <code>rgba()</code> corresponding one. If it isn't, it will be the <code>rgb()</code> corresponding one. The <code>transparent</code> keyword maps to <code>rgba(0,0,0,0)</code>.",
+ "fr": "si la valeur est translucide, la valeur calculée est la fonction <code>rgba()</code>correspondante. Sinon, la fonction <code>rgb()</code>correspondante. Le mot-clé <code>transparent</code> devient <code>rgb(0,0,0)</code>.",
+ "ja": "åéęć®å¤ćŖććčØē®å¤ćÆććć«åƾåæćć <code>rgba()</code>ććććŖćć°ćć®å¤ć«åƾåæćć <code>rgb()</code>ć<code>transparent</code> ćć¼ćÆć¼ć㯠<code>rgba(0,0,0,0)</code> ć«ćććććć¾ćć",
+ "ru": "ŠŃли Š·Š½Š°Ńение ŠæŠ¾Š»ŃŠæŃŠ¾Š·ŃŠ°Ńно, Š·Š½Š°ŃŠµŠ½ŠøŠµ Š±ŃŠ“ŠµŃ ŃŠ¾Š¾ŃвеŃŃŃŠ²Š¾Š²Š°ŃŃ <code>rgba()</code>. Š ŠµŃŠ»Šø не Š±ŃŠ“ŠµŃ ŠæŠ¾Š»ŃŠæŃŠ¾Š·ŃŠ°ŃŠ½ŃŠ¼, ŃŠ¾ Š±ŃŠ“ŠµŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°ŃŃŃŃ <code>rgb()</code>. ŠŠ»ŃŃŠµŠ²Š¾Šµ ŃŠ»Š¾Š²Š¾ <code>transparent</code> ŠøŠ½ŃŠµŃŠæŃŠµŃŠøŃŃŠµŃŃŃ Š² <code>rgba(0,0,0,0)</code>."
+ },
+ "\"\"": {
+ "en-US": "\"\" (the empty string)"
+ },
+ "\". \"": {
+ "en-US": "\". \" (full stop followed by a space)"
+ },
+ "twoAbsoluteLengthOrPercentages": {
+ "de": "zwei absolute {{cssxref(\"length\")}} oder {{cssxref(\"percentage\")}}",
+ "en-US": "two absolute {{cssxref(\"length\")}}s or {{cssxref(\"percentage\")}}s",
+ "fr": "deux {{cssxref(\"longueur\",\"longueurs\")}} absolues ou deux {{cssxref(\"pourcentage\",\"pourcentages\")}}",
+ "ja": "ļ¼ć¤ć®ēµ¶åƾēćŖ {{cssxref(\"length\")}} å㯠{{cssxref(\"percentage\")}} å¤",
+ "ru": "Гве Š°Š±ŃолŃŃŠ½ŃŃ
{{cssxref(\"length\")}} или {{cssxref(\"percentage\")}}"
+ },
+ "twoAbsoluteLengths": {
+ "de": "zwei absolute Längen",
+ "en-US": "two absolute lengths",
+ "fr": "deux longueurs absolues",
+ "ru": "Гве Š°Š±ŃолŃŃŠ½Ńе ГлинŃ"
+ },
+ "uniqueOrder": {
+ "de": "die eindeutige Reihenfolge definiert durch die formale Grammatik",
+ "en-US": "the unique non-ambiguous order defined by the formal grammar",
+ "es": "el orden único no-ambigüo definido por la gramática formal",
+ "fr": "l'ordre unique et non-ambigu défini par la grammaire formelle",
+ "ja": "å½¢å¼ęę³ć§å®ē¾©ćććäøęć®ććć¾ćć§ćŖćé åŗ",
+ "ru": "ŃŠ½ŠøŠŗŠ°Š»ŃŠ½ŃŠ¹ Š½ŠµŠ¾Š“Š½Š¾Š·Š½Š°ŃŠ½Ńй поŃŃŠ“ок, Š¾ŠæŃŠµŠ“ŠµŠ»ŃŠ½Š½Ńй ŃŠ¾ŃŠ¼Š°Š»ŃŠ½Š¾Š¹ Š³ŃŠ°Š¼Š¼Š°Ńикой"
+ },
+ "variesFromBrowserToBrowser": {
+ "de": "Variiert von einem Browser zum anderen",
+ "en-US": "Varies from one browser to another",
+ "fr": "Varie d'un navigateur à l'autre",
+ "ru": "ŠŠ°ŃŃŠøŃŃŠµŃŃŃ Š¾Ń Š±ŃŠ°ŃŠ·ŠµŃŠ° Šŗ Š±ŃŠ°ŃзеŃŃ"
+ },
+ "visibility": {
+ "de": "<a href=\"/de/docs/Web/CSS/visibility#Interpolation\">Sichtbarkeit</a>",
+ "en-US": "a <a href=\"/en-US/docs/Web/CSS/visibility#Interpolation\" title=\"Values of the visibility CSS property are interpolable if the start or the end value is visible. In that case all values of the timing function which are equal to 1 map to visible and non-equal to 1 to non-visible.\">visibility</a>",
+ "fr": "une <a href=\"/fr/docs/Web/CSS/visibility#Interpolation\" title=\"Les valeurs de la propriété CSS visibility sont interpolables si une des valeurs de début ou de fin est visible. Dans ce cas, toutes les valeurs de la fonction de temporisation qui sont égales à 1 sont associées à visible, et celles non égales à 1, à non-visible.\">visibilité</a>",
+ "ja": "<a href=\"/ja/docs/Web/CSS/visibility#Interpolation\" title=\"Values of the visibility CSS property are interpolable if the start or the end value is visible. In that case all values of the timing function which are equal to 1 map to visible and non-equal to 1 to non-visible.\">visibility</a>",
+ "ru": "<a href=\"/ru/docs/Web/CSS/visibility#Interpolation\" title=\"ŠŠ½Š°ŃŠµŠ½ŠøŃ ŃŠ²Š¾Š¹ŃŃŠ²Š° CSS visibility ŠøŠ½ŃŠµŃполиŃŃŃŃŃŃ, ŠµŃŠ»Šø Š½Š°ŃŠ°Š»Ńное или ŠŗŠ¾Š½ŠµŃное Š·Š½Š°Ńение ŃŃŃŠ°Š½Š¾Š²Š»ŠµŠ½Š¾ в visible. Š ŃŃŠ¾Š¼ ŃŠ»ŃŃŠ°Šµ Š²ŃŠµ Š·Š½Š°ŃŠµŠ½ŠøŃ Š²ŃŠµŠ¼ŠµŠ½Š½Š¾Š¹ ŃŃŠ½ŠŗŃŠøŠø, ŃŠ°Š²Š½Ńе 1 Š¾ŃŠ¾Š±ŃажаŃŃŃŃ, а не ŃŠ°Š²Š½Ńе 1 не Š¾ŃобŃажаŃŃŃŃ.\">виГимоŃŃŃ</a>"
+ },
+ "visual": {
+ "de": "visuell",
+ "en-US": "visual",
+ "fr": "visuel",
+ "ja": "č¦č¦",
+ "ru": "Š²ŠøŠ·ŃŠ°Š»ŃŠ½ŃŠ¹"
+ },
+ "visualInContinuousMediaNoEffectInOverflowColumns": {
+ "de": "<code>visual</code>, aber in kontinuierlichen Medien hat sie keinen Effekt in überlaufenden Spalten",
+ "en-US": "<code>visual</code>, but, in continuous media, has no effect in overflow columns",
+ "fr": "<code>visual</code>, mais n'a pas d'effet sur le débordement des colonnes pour un média continu",
+ "ja": "<code>visual</code>ććć ćé£ē¶ć”ćć£ć¢ć§ćÆćŖć¼ćć¼ććć¼ććåć«å¹ęćŖć",
+ "ru": "<code>visual</code>, но в ŃŠæŠ»Š¾ŃŠ½Š¾Š¹ ŃŃŠµŠ“е, не ŠøŠ¼ŠµŠµŃ никакого ŃŃŃŠµŠŗŃа ŠæŃŠø ŠæŠµŃŠµŠæŠ¾Š»Š½ŠµŠ½ŠøŠø колонок"
+ },
+ "xulImageElements": {
+ "de": "XUL {{XULElem(\"image\")}} Elementen und {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} und {{cssxref(\":-moz-tree-checkbox\")}} Pseudoelementen. <strong>Hinweis:</strong> <code>-moz-image-region</code> funktioniert nur mit {{XULElem(\"image\")}} Elementen, bei denen das Symbol durch {{cssxref(\"list-style-image\")}} angegeben wird. Es funktioniert nicht mit XUL <code><image src=\"url\" /></code>.",
+ "en-US": "XUL {{XULElem(\"image\")}} elements and {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}}, and {{cssxref(\":-moz-tree-checkbox\")}} pseudo-elements. <strong>Note:</strong> <code>-moz-image-region</code> only works with {{XULElem(\"image\")}} elements where the icon is specified using {{cssxref(\"list-style-image\")}}. It will not work with XUL <code><image src=\"url\" /></code>.",
+ "fr": "éléments XUL {{XULElem(\"image\")}} et aux pseudo-éléments {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} et {{cssxref(\":-moz-tree-checkbox\")}}. <strong>Note :</strong> <code>-moz-image-region</code> ne fonctionnera qu'avec les éléments {{XULElem(\"image\")}} où l'icône est définie avec {{cssxref(\"list-style-image\")}}. Cela ne fonctionnera pas avec l'<code><image src=\"url\" /></code> XUL.",
+ "ru": "XUL {{XULElem(\"image\")}} ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Šø {{cssxref(\":-moz-tree-image\")}}, {{cssxref(\":-moz-tree-twisty\")}} Šø {{cssxref(\":-moz-tree-checkbox\")}} ŠæŃŠµŠ²Š“Š¾ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ. <strong>ŠŠ°Š¼ŠµŃŃŃŠµ:</strong> <code>-moz-image-region</code> ŃŠ°Š±Š¾ŃŠ°ŠµŃ ŃŠ¾Š»Ńко Ń ŃŠ»ŠµŠ¼ŠµŠ½Ńами {{XULElem(\"image\")}}, гГе иконка Š¾ŠæŃŠµŠ“ŠµŠ»ŃŠµŃŃŃ ŠøŃŠæŠ¾Š»ŃŠ·Š¾Š²Š°Š½ŠøŠµŠ¼ {{cssxref(\"list-style-image\")}}. ŠŃо не Š±ŃŠ“ŠµŃ ŃŠ°Š±Š¾ŃаŃŃ Ń XUL <code><image src=\"url\" /></code>."
+ },
+ "yes": {
+ "de": "Ja",
+ "en-US": "yes",
+ "fr": "oui",
+ "ja": "ćć",
+ "pl": "tak",
+ "ru": "Га"
+ },
+ "zoomForTheTopLevelNoneForTheRest": {
+ "en-US": "zoom for the top level element, none for all other elements"
+ }
+}
diff --git a/node_modules/csso/node_modules/mdn-data/l10n/index.js b/node_modules/csso/node_modules/mdn-data/l10n/index.js
new file mode 100644
index 0000000..e1bea42
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/l10n/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+ css: require('./css'),
+}
diff --git a/node_modules/csso/node_modules/mdn-data/package.json b/node_modules/csso/node_modules/mdn-data/package.json
new file mode 100644
index 0000000..40264c7
--- /dev/null
+++ b/node_modules/csso/node_modules/mdn-data/package.json
@@ -0,0 +1,66 @@
+{
+ "_from": "mdn-data@2.0.14",
+ "_id": "mdn-data@2.0.14",
+ "_inBundle": false,
+ "_integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "_location": "/csso/mdn-data",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "version",
+ "registry": true,
+ "raw": "mdn-data@2.0.14",
+ "name": "mdn-data",
+ "escapedName": "mdn-data",
+ "rawSpec": "2.0.14",
+ "saveSpec": null,
+ "fetchSpec": "2.0.14"
+ },
+ "_requiredBy": [
+ "/csso/css-tree"
+ ],
+ "_resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "_shasum": "7113fc4281917d63ce29b43446f701e68c25ba50",
+ "_spec": "mdn-data@2.0.14",
+ "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\csso\\node_modules\\css-tree",
+ "author": {
+ "name": "Mozilla Developer Network"
+ },
+ "bugs": {
+ "url": "https://github.com/mdn/data/issues"
+ },
+ "bundleDependencies": false,
+ "deprecated": false,
+ "description": "Open Web data by the Mozilla Developer Network",
+ "devDependencies": {
+ "ajv": "^5.0.1",
+ "better-ajv-errors": "^0.5.1"
+ },
+ "files": [
+ "api/index.js",
+ "api/*.json",
+ "css/index.js",
+ "css/*.json",
+ "l10n/index.js",
+ "l10n/*.json"
+ ],
+ "homepage": "https://developer.mozilla.org",
+ "keywords": [
+ "data",
+ "mdn",
+ "mozilla",
+ "css"
+ ],
+ "license": "CC0-1.0",
+ "main": "index.js",
+ "name": "mdn-data",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mdn/data.git"
+ },
+ "scripts": {
+ "lint": "node test/lint",
+ "test": "npm run lint",
+ "travis": "npm test"
+ },
+ "version": "2.0.14"
+}
diff --git a/node_modules/csso/node_modules/source-map/CHANGELOG.md b/node_modules/csso/node_modules/source-map/CHANGELOG.md
new file mode 100644
index 0000000..3a8c066
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/CHANGELOG.md
@@ -0,0 +1,301 @@
+# Change Log
+
+## 0.5.6
+
+* Fix for regression when people were using numbers as names in source maps. See
+ #236.
+
+## 0.5.5
+
+* Fix "regression" of unsupported, implementation behavior that half the world
+ happens to have come to depend on. See #235.
+
+* Fix regression involving function hoisting in SpiderMonkey. See #233.
+
+## 0.5.4
+
+* Large performance improvements to source-map serialization. See #228 and #229.
+
+## 0.5.3
+
+* Do not include unnecessary distribution files. See
+ commit ef7006f8d1647e0a83fdc60f04f5a7ca54886f86.
+
+## 0.5.2
+
+* Include browser distributions of the library in package.json's `files`. See
+ issue #212.
+
+## 0.5.1
+
+* Fix latent bugs in IndexedSourceMapConsumer.prototype._parseMappings. See
+ ff05274becc9e6e1295ed60f3ea090d31d843379.
+
+## 0.5.0
+
+* Node 0.8 is no longer supported.
+
+* Use webpack instead of dryice for bundling.
+
+* Big speedups serializing source maps. See pull request #203.
+
+* Fix a bug with `SourceMapConsumer.prototype.sourceContentFor` and sources that
+ explicitly start with the source root. See issue #199.
+
+## 0.4.4
+
+* Fix an issue where using a `SourceMapGenerator` after having created a
+ `SourceMapConsumer` from it via `SourceMapConsumer.fromSourceMap` failed. See
+ issue #191.
+
+* Fix an issue with where `SourceMapGenerator` would mistakenly consider
+ different mappings as duplicates of each other and avoid generating them. See
+ issue #192.
+
+## 0.4.3
+
+* A very large number of performance improvements, particularly when parsing
+ source maps. Collectively about 75% of time shaved off of the source map
+ parsing benchmark!
+
+* Fix a bug in `SourceMapConsumer.prototype.allGeneratedPositionsFor` and fuzzy
+ searching in the presence of a column option. See issue #177.
+
+* Fix a bug with joining a source and its source root when the source is above
+ the root. See issue #182.
+
+* Add the `SourceMapConsumer.prototype.hasContentsOfAllSources` method to
+ determine when all sources' contents are inlined into the source map. See
+ issue #190.
+
+## 0.4.2
+
+* Add an `.npmignore` file so that the benchmarks aren't pulled down by
+ dependent projects. Issue #169.
+
+* Add an optional `column` argument to
+ `SourceMapConsumer.prototype.allGeneratedPositionsFor` and better handle lines
+ with no mappings. Issues #172 and #173.
+
+## 0.4.1
+
+* Fix accidentally defining a global variable. #170.
+
+## 0.4.0
+
+* The default direction for fuzzy searching was changed back to its original
+ direction. See #164.
+
+* There is now a `bias` option you can supply to `SourceMapConsumer` to control
+ the fuzzy searching direction. See #167.
+
+* About an 8% speed up in parsing source maps. See #159.
+
+* Added a benchmark for parsing and generating source maps.
+
+## 0.3.0
+
+* Change the default direction that searching for positions fuzzes when there is
+ not an exact match. See #154.
+
+* Support for environments using json2.js for JSON serialization. See #156.
+
+## 0.2.0
+
+* Support for consuming "indexed" source maps which do not have any remote
+ sections. See pull request #127. This introduces a minor backwards
+ incompatibility if you are monkey patching `SourceMapConsumer.prototype`
+ methods.
+
+## 0.1.43
+
+* Performance improvements for `SourceMapGenerator` and `SourceNode`. See issue
+ #148 for some discussion and issues #150, #151, and #152 for implementations.
+
+## 0.1.42
+
+* Fix an issue where `SourceNode`s from different versions of the source-map
+ library couldn't be used in conjunction with each other. See issue #142.
+
+## 0.1.41
+
+* Fix a bug with getting the source content of relative sources with a "./"
+ prefix. See issue #145 and [Bug 1090768](bugzil.la/1090768).
+
+* Add the `SourceMapConsumer.prototype.computeColumnSpans` method to compute the
+ column span of each mapping.
+
+* Add the `SourceMapConsumer.prototype.allGeneratedPositionsFor` method to find
+ all generated positions associated with a given original source and line.
+
+## 0.1.40
+
+* Performance improvements for parsing source maps in SourceMapConsumer.
+
+## 0.1.39
+
+* Fix a bug where setting a source's contents to null before any source content
+ had been set before threw a TypeError. See issue #131.
+
+## 0.1.38
+
+* Fix a bug where finding relative paths from an empty path were creating
+ absolute paths. See issue #129.
+
+## 0.1.37
+
+* Fix a bug where if the source root was an empty string, relative source paths
+ would turn into absolute source paths. Issue #124.
+
+## 0.1.36
+
+* Allow the `names` mapping property to be an empty string. Issue #121.
+
+## 0.1.35
+
+* A third optional parameter was added to `SourceNode.fromStringWithSourceMap`
+ to specify a path that relative sources in the second parameter should be
+ relative to. Issue #105.
+
+* If no file property is given to a `SourceMapGenerator`, then the resulting
+ source map will no longer have a `null` file property. The property will
+ simply not exist. Issue #104.
+
+* Fixed a bug where consecutive newlines were ignored in `SourceNode`s.
+ Issue #116.
+
+## 0.1.34
+
+* Make `SourceNode` work with windows style ("\r\n") newlines. Issue #103.
+
+* Fix bug involving source contents and the
+ `SourceMapGenerator.prototype.applySourceMap`. Issue #100.
+
+## 0.1.33
+
+* Fix some edge cases surrounding path joining and URL resolution.
+
+* Add a third parameter for relative path to
+ `SourceMapGenerator.prototype.applySourceMap`.
+
+* Fix issues with mappings and EOLs.
+
+## 0.1.32
+
+* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns
+ (issue 92).
+
+* Fixed test runner to actually report number of failed tests as its process
+ exit code.
+
+* Fixed a typo when reporting bad mappings (issue 87).
+
+## 0.1.31
+
+* Delay parsing the mappings in SourceMapConsumer until queried for a source
+ location.
+
+* Support Sass source maps (which at the time of writing deviate from the spec
+ in small ways) in SourceMapConsumer.
+
+## 0.1.30
+
+* Do not join source root with a source, when the source is a data URI.
+
+* Extend the test runner to allow running single specific test files at a time.
+
+* Performance improvements in `SourceNode.prototype.walk` and
+ `SourceMapConsumer.prototype.eachMapping`.
+
+* Source map browser builds will now work inside Workers.
+
+* Better error messages when attempting to add an invalid mapping to a
+ `SourceMapGenerator`.
+
+## 0.1.29
+
+* Allow duplicate entries in the `names` and `sources` arrays of source maps
+ (usually from TypeScript) we are parsing. Fixes github issue 72.
+
+## 0.1.28
+
+* Skip duplicate mappings when creating source maps from SourceNode; github
+ issue 75.
+
+## 0.1.27
+
+* Don't throw an error when the `file` property is missing in SourceMapConsumer,
+ we don't use it anyway.
+
+## 0.1.26
+
+* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.
+
+## 0.1.25
+
+* Make compatible with browserify
+
+## 0.1.24
+
+* Fix issue with absolute paths and `file://` URIs. See
+ https://bugzilla.mozilla.org/show_bug.cgi?id=885597
+
+## 0.1.23
+
+* Fix issue with absolute paths and sourcesContent, github issue 64.
+
+## 0.1.22
+
+* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.
+
+## 0.1.21
+
+* Fixed handling of sources that start with a slash so that they are relative to
+ the source root's host.
+
+## 0.1.20
+
+* Fixed github issue #43: absolute URLs aren't joined with the source root
+ anymore.
+
+## 0.1.19
+
+* Using Travis CI to run tests.
+
+## 0.1.18
+
+* Fixed a bug in the handling of sourceRoot.
+
+## 0.1.17
+
+* Added SourceNode.fromStringWithSourceMap.
+
+## 0.1.16
+
+* Added missing documentation.
+
+* Fixed the generating of empty mappings in SourceNode.
+
+## 0.1.15
+
+* Added SourceMapGenerator.applySourceMap.
+
+## 0.1.14
+
+* The sourceRoot is now handled consistently.
+
+## 0.1.13
+
+* Added SourceMapGenerator.fromSourceMap.
+
+## 0.1.12
+
+* SourceNode now generates empty mappings too.
+
+## 0.1.11
+
+* Added name support to SourceNode.
+
+## 0.1.10
+
+* Added sourcesContent support to the customer and generator.
diff --git a/node_modules/csso/node_modules/source-map/LICENSE b/node_modules/csso/node_modules/source-map/LICENSE
new file mode 100644
index 0000000..ed1b7cf
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/LICENSE
@@ -0,0 +1,28 @@
+
+Copyright (c) 2009-2011, Mozilla Foundation and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the names of the Mozilla Foundation nor the names of project
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/csso/node_modules/source-map/README.md b/node_modules/csso/node_modules/source-map/README.md
new file mode 100644
index 0000000..fea4beb
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/README.md
@@ -0,0 +1,742 @@
+# Source Map
+
+[](https://travis-ci.org/mozilla/source-map)
+
+[](https://www.npmjs.com/package/source-map)
+
+This is a library to generate and consume the source map format
+[described here][format].
+
+[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
+
+## Use with Node
+
+ $ npm install source-map
+
+## Use on the Web
+
+ <script src="https://raw.githubusercontent.com/mozilla/source-map/master/dist/source-map.min.js" defer></script>
+
+--------------------------------------------------------------------------------
+
+<!-- `npm run toc` to regenerate the Table of Contents -->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+## Table of Contents
+
+- [Examples](#examples)
+ - [Consuming a source map](#consuming-a-source-map)
+ - [Generating a source map](#generating-a-source-map)
+ - [With SourceNode (high level API)](#with-sourcenode-high-level-api)
+ - [With SourceMapGenerator (low level API)](#with-sourcemapgenerator-low-level-api)
+- [API](#api)
+ - [SourceMapConsumer](#sourcemapconsumer)
+ - [new SourceMapConsumer(rawSourceMap)](#new-sourcemapconsumerrawsourcemap)
+ - [SourceMapConsumer.prototype.computeColumnSpans()](#sourcemapconsumerprototypecomputecolumnspans)
+ - [SourceMapConsumer.prototype.originalPositionFor(generatedPosition)](#sourcemapconsumerprototypeoriginalpositionforgeneratedposition)
+ - [SourceMapConsumer.prototype.generatedPositionFor(originalPosition)](#sourcemapconsumerprototypegeneratedpositionfororiginalposition)
+ - [SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)](#sourcemapconsumerprototypeallgeneratedpositionsfororiginalposition)
+ - [SourceMapConsumer.prototype.hasContentsOfAllSources()](#sourcemapconsumerprototypehascontentsofallsources)
+ - [SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])](#sourcemapconsumerprototypesourcecontentforsource-returnnullonmissing)
+ - [SourceMapConsumer.prototype.eachMapping(callback, context, order)](#sourcemapconsumerprototypeeachmappingcallback-context-order)
+ - [SourceMapGenerator](#sourcemapgenerator)
+ - [new SourceMapGenerator([startOfSourceMap])](#new-sourcemapgeneratorstartofsourcemap)
+ - [SourceMapGenerator.fromSourceMap(sourceMapConsumer)](#sourcemapgeneratorfromsourcemapsourcemapconsumer)
+ - [SourceMapGenerator.prototype.addMapping(mapping)](#sourcemapgeneratorprototypeaddmappingmapping)
+ - [SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)](#sourcemapgeneratorprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])](#sourcemapgeneratorprototypeapplysourcemapsourcemapconsumer-sourcefile-sourcemappath)
+ - [SourceMapGenerator.prototype.toString()](#sourcemapgeneratorprototypetostring)
+ - [SourceNode](#sourcenode)
+ - [new SourceNode([line, column, source[, chunk[, name]]])](#new-sourcenodeline-column-source-chunk-name)
+ - [SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])](#sourcenodefromstringwithsourcemapcode-sourcemapconsumer-relativepath)
+ - [SourceNode.prototype.add(chunk)](#sourcenodeprototypeaddchunk)
+ - [SourceNode.prototype.prepend(chunk)](#sourcenodeprototypeprependchunk)
+ - [SourceNode.prototype.setSourceContent(sourceFile, sourceContent)](#sourcenodeprototypesetsourcecontentsourcefile-sourcecontent)
+ - [SourceNode.prototype.walk(fn)](#sourcenodeprototypewalkfn)
+ - [SourceNode.prototype.walkSourceContents(fn)](#sourcenodeprototypewalksourcecontentsfn)
+ - [SourceNode.prototype.join(sep)](#sourcenodeprototypejoinsep)
+ - [SourceNode.prototype.replaceRight(pattern, replacement)](#sourcenodeprototypereplacerightpattern-replacement)
+ - [SourceNode.prototype.toString()](#sourcenodeprototypetostring)
+ - [SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])](#sourcenodeprototypetostringwithsourcemapstartofsourcemap)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+## Examples
+
+### Consuming a source map
+
+```js
+var rawSourceMap = {
+ version: 3,
+ file: 'min.js',
+ names: ['bar', 'baz', 'n'],
+ sources: ['one.js', 'two.js'],
+ sourceRoot: 'http://example.com/www/js/',
+ mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
+};
+
+var smc = new SourceMapConsumer(rawSourceMap);
+
+console.log(smc.sources);
+// [ 'http://example.com/www/js/one.js',
+// 'http://example.com/www/js/two.js' ]
+
+console.log(smc.originalPositionFor({
+ line: 2,
+ column: 28
+}));
+// { source: 'http://example.com/www/js/two.js',
+// line: 2,
+// column: 10,
+// name: 'n' }
+
+console.log(smc.generatedPositionFor({
+ source: 'http://example.com/www/js/two.js',
+ line: 2,
+ column: 10
+}));
+// { line: 2, column: 28 }
+
+smc.eachMapping(function (m) {
+ // ...
+});
+```
+
+### Generating a source map
+
+In depth guide:
+[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
+
+#### With SourceNode (high level API)
+
+```js
+function compile(ast) {
+ switch (ast.type) {
+ case 'BinaryExpression':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ [compile(ast.left), " + ", compile(ast.right)]
+ );
+ case 'Literal':
+ return new SourceNode(
+ ast.location.line,
+ ast.location.column,
+ ast.location.source,
+ String(ast.value)
+ );
+ // ...
+ default:
+ throw new Error("Bad AST");
+ }
+}
+
+var ast = parse("40 + 2", "add.js");
+console.log(compile(ast).toStringWithSourceMap({
+ file: 'add.js'
+}));
+// { code: '40 + 2',
+// map: [object SourceMapGenerator] }
+```
+
+#### With SourceMapGenerator (low level API)
+
+```js
+var map = new SourceMapGenerator({
+ file: "source-mapped.js"
+});
+
+map.addMapping({
+ generated: {
+ line: 10,
+ column: 35
+ },
+ source: "foo.js",
+ original: {
+ line: 33,
+ column: 2
+ },
+ name: "christopher"
+});
+
+console.log(map.toString());
+// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
+```
+
+## API
+
+Get a reference to the module:
+
+```js
+// Node.js
+var sourceMap = require('source-map');
+
+// Browser builds
+var sourceMap = window.sourceMap;
+
+// Inside Firefox
+const sourceMap = require("devtools/toolkit/sourcemap/source-map.js");
+```
+
+### SourceMapConsumer
+
+A SourceMapConsumer instance represents a parsed source map which we can query
+for information about the original file positions by giving it a file position
+in the generated source.
+
+#### new SourceMapConsumer(rawSourceMap)
+
+The only parameter is the raw source map (either as a string which can be
+`JSON.parse`'d, or an object). According to the spec, source maps have the
+following attributes:
+
+* `version`: Which version of the source map spec this map is following.
+
+* `sources`: An array of URLs to the original source files.
+
+* `names`: An array of identifiers which can be referenced by individual
+ mappings.
+
+* `sourceRoot`: Optional. The URL root from which all sources are relative.
+
+* `sourcesContent`: Optional. An array of contents of the original source files.
+
+* `mappings`: A string of base64 VLQs which contain the actual mappings.
+
+* `file`: Optional. The generated filename this source map is associated with.
+
+```js
+var consumer = new sourceMap.SourceMapConsumer(rawSourceMapJsonData);
+```
+
+#### SourceMapConsumer.prototype.computeColumnSpans()
+
+Compute the last column for each generated mapping. The last column is
+inclusive.
+
+```js
+// Before:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+
+consumer.computeColumnSpans();
+
+// After:
+consumer.allGeneratedPositionsFor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1,
+// lastColumn: 9 },
+// { line: 2,
+// column: 10,
+// lastColumn: 19 },
+// { line: 2,
+// column: 20,
+// lastColumn: Infinity } ]
+
+```
+
+#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
+
+Returns the original source, line, and column information for the generated
+source's line and column positions provided. The only argument is an object with
+the following properties:
+
+* `line`: The line number in the generated source. Line numbers in
+ this library are 1-based (note that the underlying source map
+ specification uses 0-based line numbers -- this library handles the
+ translation).
+
+* `column`: The column number in the generated source. Column numbers
+ in this library are 0-based.
+
+* `bias`: Either `SourceMapConsumer.GREATEST_LOWER_BOUND` or
+ `SourceMapConsumer.LEAST_UPPER_BOUND`. Specifies whether to return the closest
+ element that is smaller than or greater than the one we are searching for,
+ respectively, if the exact element cannot be found. Defaults to
+ `SourceMapConsumer.GREATEST_LOWER_BOUND`.
+
+and an object is returned with the following properties:
+
+* `source`: The original source file, or null if this information is not
+ available.
+
+* `line`: The line number in the original source, or null if this information is
+ not available. The line number is 1-based.
+
+* `column`: The column number in the original source, or null if this
+ information is not available. The column number is 0-based.
+
+* `name`: The original identifier, or null if this information is not available.
+
+```js
+consumer.originalPositionFor({ line: 2, column: 10 })
+// { source: 'foo.coffee',
+// line: 2,
+// column: 2,
+// name: null }
+
+consumer.originalPositionFor({ line: 99999999999999999, column: 999999999999999 })
+// { source: null,
+// line: null,
+// column: null,
+// name: null }
+```
+
+#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
+
+Returns the generated line and column information for the original source,
+line, and column positions provided. The only argument is an object with
+the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: The column number in the original source. The column
+ number is 0-based.
+
+and an object is returned with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.generatedPositionFor({ source: "example.js", line: 2, column: 10 })
+// { line: 1,
+// column: 56 }
+```
+
+#### SourceMapConsumer.prototype.allGeneratedPositionsFor(originalPosition)
+
+Returns all generated line and column information for the original source, line,
+and column provided. If no column is provided, returns all mappings
+corresponding to a either the line we are searching for or the next closest line
+that has any mappings. Otherwise, returns all mappings corresponding to the
+given line and either the column we are searching for or the next closest column
+that has any offsets.
+
+The only argument is an object with the following properties:
+
+* `source`: The filename of the original source.
+
+* `line`: The line number in the original source. The line number is
+ 1-based.
+
+* `column`: Optional. The column number in the original source. The
+ column number is 0-based.
+
+and an array of objects is returned, each with the following properties:
+
+* `line`: The line number in the generated source, or null. The line
+ number is 1-based.
+
+* `column`: The column number in the generated source, or null. The
+ column number is 0-based.
+
+```js
+consumer.allGeneratedpositionsfor({ line: 2, source: "foo.coffee" })
+// [ { line: 2,
+// column: 1 },
+// { line: 2,
+// column: 10 },
+// { line: 2,
+// column: 20 } ]
+```
+
+#### SourceMapConsumer.prototype.hasContentsOfAllSources()
+
+Return true if we have the embedded source content for every source listed in
+the source map, false otherwise.
+
+In other words, if this method returns `true`, then
+`consumer.sourceContentFor(s)` will succeed for every source `s` in
+`consumer.sources`.
+
+```js
+// ...
+if (consumer.hasContentsOfAllSources()) {
+ consumerReadyCallback(consumer);
+} else {
+ fetchSources(consumer, consumerReadyCallback);
+}
+// ...
+```
+
+#### SourceMapConsumer.prototype.sourceContentFor(source[, returnNullOnMissing])
+
+Returns the original source content for the source provided. The only
+argument is the URL of the original source file.
+
+If the source content for the given source is not found, then an error is
+thrown. Optionally, pass `true` as the second param to have `null` returned
+instead.
+
+```js
+consumer.sources
+// [ "my-cool-lib.clj" ]
+
+consumer.sourceContentFor("my-cool-lib.clj")
+// "..."
+
+consumer.sourceContentFor("this is not in the source map");
+// Error: "this is not in the source map" is not in the source map
+
+consumer.sourceContentFor("this is not in the source map", true);
+// null
+```
+
+#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
+
+Iterate over each mapping between an original source/line/column and a
+generated line/column in this source map.
+
+* `callback`: The function that is called with each mapping. Mappings have the
+ form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
+ name }`
+
+* `context`: Optional. If specified, this object will be the value of `this`
+ every time that `callback` is called.
+
+* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
+ `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
+ the mappings sorted by the generated file's line/column order or the
+ original's source/line/column order, respectively. Defaults to
+ `SourceMapConsumer.GENERATED_ORDER`.
+
+```js
+consumer.eachMapping(function (m) { console.log(m); })
+// ...
+// { source: 'illmatic.js',
+// generatedLine: 1,
+// generatedColumn: 0,
+// originalLine: 1,
+// originalColumn: 0,
+// name: null }
+// { source: 'illmatic.js',
+// generatedLine: 2,
+// generatedColumn: 0,
+// originalLine: 2,
+// originalColumn: 0,
+// name: null }
+// ...
+```
+### SourceMapGenerator
+
+An instance of the SourceMapGenerator represents a source map which is being
+built incrementally.
+
+#### new SourceMapGenerator([startOfSourceMap])
+
+You may pass an object with the following properties:
+
+* `file`: The filename of the generated source that this source map is
+ associated with.
+
+* `sourceRoot`: A root for all relative URLs in this source map.
+
+* `skipValidation`: Optional. When `true`, disables validation of mappings as
+ they are added. This can improve performance but should be used with
+ discretion, as a last resort. Even then, one should avoid using this flag when
+ running tests, if possible.
+
+```js
+var generator = new sourceMap.SourceMapGenerator({
+ file: "my-generated-javascript-file.js",
+ sourceRoot: "http://example.com/app/js/"
+});
+```
+
+#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
+
+Creates a new `SourceMapGenerator` from an existing `SourceMapConsumer` instance.
+
+* `sourceMapConsumer` The SourceMap.
+
+```js
+var generator = sourceMap.SourceMapGenerator.fromSourceMap(consumer);
+```
+
+#### SourceMapGenerator.prototype.addMapping(mapping)
+
+Add a single mapping from original source line and column to the generated
+source's line and column for this source map being created. The mapping object
+should have the following properties:
+
+* `generated`: An object with the generated line and column positions.
+
+* `original`: An object with the original line and column positions.
+
+* `source`: The original source file (relative to the sourceRoot).
+
+* `name`: An optional original token name for this mapping.
+
+```js
+generator.addMapping({
+ source: "module-one.scm",
+ original: { line: 128, column: 0 },
+ generated: { line: 3, column: 456 }
+})
+```
+
+#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for an original source file.
+
+* `sourceFile` the URL of the original source file.
+
+* `sourceContent` the content of the source file.
+
+```js
+generator.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile[, sourceMapPath]])
+
+Applies a SourceMap for a source file to the SourceMap.
+Each mapping to the supplied source file is rewritten using the
+supplied SourceMap. Note: The resolution for the resulting mappings
+is the minimum of this map and the supplied map.
+
+* `sourceMapConsumer`: The SourceMap to be applied.
+
+* `sourceFile`: Optional. The filename of the source file.
+ If omitted, sourceMapConsumer.file will be used, if it exists.
+ Otherwise an error will be thrown.
+
+* `sourceMapPath`: Optional. The dirname of the path to the SourceMap
+ to be applied. If relative, it is relative to the SourceMap.
+
+ This parameter is needed when the two SourceMaps aren't in the same
+ directory, and the SourceMap to be applied contains relative source
+ paths. If so, those relative source paths need to be rewritten
+ relative to the SourceMap.
+
+ If omitted, it is assumed that both SourceMaps are in the same directory,
+ thus not needing any rewriting. (Supplying `'.'` has the same effect.)
+
+#### SourceMapGenerator.prototype.toString()
+
+Renders the source map being generated to a string.
+
+```js
+generator.toString()
+// '{"version":3,"sources":["module-one.scm"],"names":[],"mappings":"...snip...","file":"my-generated-javascript-file.js","sourceRoot":"http://example.com/app/js/"}'
+```
+
+### SourceNode
+
+SourceNodes provide a way to abstract over interpolating and/or concatenating
+snippets of generated JavaScript source code, while maintaining the line and
+column information associated between those snippets and the original source
+code. This is useful as the final intermediate representation a compiler might
+use before outputting the generated JS and source map.
+
+#### new SourceNode([line, column, source[, chunk[, name]]])
+
+* `line`: The original line number associated with this source node, or null if
+ it isn't associated with an original line. The line number is 1-based.
+
+* `column`: The original column number associated with this source node, or null
+ if it isn't associated with an original column. The column number
+ is 0-based.
+
+* `source`: The original source's filename; null if no filename is provided.
+
+* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
+ below.
+
+* `name`: Optional. The original identifier.
+
+```js
+var node = new SourceNode(1, 2, "a.cpp", [
+ new SourceNode(3, 4, "b.cpp", "extern int status;\n"),
+ new SourceNode(5, 6, "c.cpp", "std::string* make_string(size_t n);\n"),
+ new SourceNode(7, 8, "d.cpp", "int main(int argc, char** argv) {}\n"),
+]);
+```
+
+#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer[, relativePath])
+
+Creates a SourceNode from generated code and a SourceMapConsumer.
+
+* `code`: The generated code
+
+* `sourceMapConsumer` The SourceMap for the generated code
+
+* `relativePath` The optional path that relative sources in `sourceMapConsumer`
+ should be relative to.
+
+```js
+var consumer = new SourceMapConsumer(fs.readFileSync("path/to/my-file.js.map", "utf8"));
+var node = SourceNode.fromStringWithSourceMap(fs.readFileSync("path/to/my-file.js"),
+ consumer);
+```
+
+#### SourceNode.prototype.add(chunk)
+
+Add a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.add(" + ");
+node.add(otherNode);
+node.add([leftHandOperandNode, " + ", rightHandOperandNode]);
+```
+
+#### SourceNode.prototype.prepend(chunk)
+
+Prepend a chunk of generated JS to this source node.
+
+* `chunk`: A string snippet of generated JS code, another instance of
+ `SourceNode`, or an array where each member is one of those things.
+
+```js
+node.prepend("/** Build Id: f783haef86324gf **/\n\n");
+```
+
+#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
+
+Set the source content for a source file. This will be added to the
+`SourceMap` in the `sourcesContent` field.
+
+* `sourceFile`: The filename of the source file
+
+* `sourceContent`: The content of the source file
+
+```js
+node.setSourceContent("module-one.scm",
+ fs.readFileSync("path/to/module-one.scm"))
+```
+
+#### SourceNode.prototype.walk(fn)
+
+Walk over the tree of JS snippets in this node and its children. The walking
+function is called once for each snippet of JS and is passed that snippet and
+the its original associated source's line/column location.
+
+* `fn`: The traversal function.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.walk(function (code, loc) { console.log("WALK:", code, loc); })
+// WALK: uno { source: 'b.js', line: 3, column: 4, name: null }
+// WALK: dos { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: tres { source: 'a.js', line: 1, column: 2, name: null }
+// WALK: quatro { source: 'c.js', line: 5, column: 6, name: null }
+```
+
+#### SourceNode.prototype.walkSourceContents(fn)
+
+Walk over the tree of SourceNodes. The walking function is called for each
+source file content and is passed the filename and source content.
+
+* `fn`: The traversal function.
+
+```js
+var a = new SourceNode(1, 2, "a.js", "generated from a");
+a.setSourceContent("a.js", "original a");
+var b = new SourceNode(1, 2, "b.js", "generated from b");
+b.setSourceContent("b.js", "original b");
+var c = new SourceNode(1, 2, "c.js", "generated from c");
+c.setSourceContent("c.js", "original c");
+
+var node = new SourceNode(null, null, null, [a, b, c]);
+node.walkSourceContents(function (source, contents) { console.log("WALK:", source, ":", contents); })
+// WALK: a.js : original a
+// WALK: b.js : original b
+// WALK: c.js : original c
+```
+
+#### SourceNode.prototype.join(sep)
+
+Like `Array.prototype.join` except for SourceNodes. Inserts the separator
+between each of this source node's children.
+
+* `sep`: The separator.
+
+```js
+var lhs = new SourceNode(1, 2, "a.rs", "my_copy");
+var operand = new SourceNode(3, 4, "a.rs", "=");
+var rhs = new SourceNode(5, 6, "a.rs", "orig.clone()");
+
+var node = new SourceNode(null, null, null, [ lhs, operand, rhs ]);
+var joinedNode = node.join(" ");
+```
+
+#### SourceNode.prototype.replaceRight(pattern, replacement)
+
+Call `String.prototype.replace` on the very right-most source snippet. Useful
+for trimming white space from the end of a source node, etc.
+
+* `pattern`: The pattern to replace.
+
+* `replacement`: The thing to replace the pattern with.
+
+```js
+// Trim trailing white space.
+node.replaceRight(/\s*$/, "");
+```
+
+#### SourceNode.prototype.toString()
+
+Return the string representation of this source node. Walks over the tree and
+concatenates all the various snippets together to one string.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toString()
+// 'unodostresquatro'
+```
+
+#### SourceNode.prototype.toStringWithSourceMap([startOfSourceMap])
+
+Returns the string representation of this tree of source nodes, plus a
+SourceMapGenerator which contains all the mappings between the generated and
+original sources.
+
+The arguments are the same as those to `new SourceMapGenerator`.
+
+```js
+var node = new SourceNode(1, 2, "a.js", [
+ new SourceNode(3, 4, "b.js", "uno"),
+ "dos",
+ [
+ "tres",
+ new SourceNode(5, 6, "c.js", "quatro")
+ ]
+]);
+
+node.toStringWithSourceMap({ file: "my-output-file.js" })
+// { code: 'unodostresquatro',
+// map: [object SourceMapGenerator] }
+```
diff --git a/node_modules/csso/node_modules/source-map/dist/source-map.debug.js b/node_modules/csso/node_modules/source-map/dist/source-map.debug.js
new file mode 100644
index 0000000..aad0620
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/dist/source-map.debug.js
@@ -0,0 +1,3234 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["sourceMap"] = factory();
+ else
+ root["sourceMap"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+ exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
+ exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
+ exports.SourceNode = __webpack_require__(10).SourceNode;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var base64VLQ = __webpack_require__(2);
+ var util = __webpack_require__(4);
+ var ArraySet = __webpack_require__(5).ArraySet;
+ var MappingList = __webpack_require__(6).MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source)
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = ''
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+ exports.SourceMapGenerator = SourceMapGenerator;
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var base64 = __webpack_require__(3);
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+ };
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ exports.encode = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+
+ /**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+ exports.decode = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+ };
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+ }
+ exports.relative = relative;
+
+ var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+ }());
+
+ function identity (s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto ? identity : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+ var has = Object.prototype.hasOwnProperty;
+ var hasNativeMap = typeof Map !== "undefined";
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ ArraySet.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ exports.ArraySet = ArraySet;
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ exports.MappingList = MappingList;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+ var binarySearch = __webpack_require__(8);
+ var ArraySet = __webpack_require__(5).ArraySet;
+ var base64VLQ = __webpack_require__(2);
+ var quickSort = __webpack_require__(9).quickSort;
+
+ function SourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ }
+
+ SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer.prototype._version = 3;
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+
+ SourceMapConsumer.prototype.__generatedMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ SourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+ SourceMapConsumer.GENERATED_ORDER = 1;
+ SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+ SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+ SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ SourceMapConsumer.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ SourceMapConsumer.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+ exports.SourceMapConsumer = SourceMapConsumer;
+
+ /**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ BasicSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+ });
+
+ /**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+ function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64VLQ.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+ exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+ /**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+ }
+
+ IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ IndexedSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+ });
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ exports.GREATEST_LOWER_BOUND = 1;
+ exports.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+ };
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ // It turns out that some (most?) JavaScript engines don't self-host
+ // `Array.prototype.sort`. This makes sense because C++ will likely remain
+ // faster than JS when doing raw CPU-intensive sorting. However, when using a
+ // custom comparator function, calling back and forth between the VM's C++ and
+ // JIT'd JS is rather slow *and* loses JIT type information, resulting in
+ // worse generated code for the comparator function than would be optimal. In
+ // fact, when sorting with a comparator, these costs outweigh the benefits of
+ // sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+ // a ~3500ms mean speed-up in `bench/bench.html`.
+
+ /**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+ function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+ }
+
+ /**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+ function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+ }
+
+ /**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+ function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+ }
+
+ /**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+ exports.quickSort = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+ };
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
+ var util = __webpack_require__(4);
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ var REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ var NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ var isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ SourceNode.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+ };
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ };
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+ };
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ SourceNode.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+ };
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+ };
+
+ exports.SourceNode = SourceNode;
+
+
+/***/ })
+/******/ ])
+});
+;
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIndlYnBhY2s6Ly8vLi9zb3VyY2UtbWFwLmpzIiwid2VicGFjazovLy8uL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LXZscS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvc291cmNlLW5vZGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE1BQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3hhQSxpQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBMkQ7QUFDM0QscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBOzs7Ozs7O0FDM0lBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLG9CQUFtQjtBQUNuQixxQkFBb0I7O0FBRXBCLGlCQUFnQjtBQUNoQixpQkFBZ0I7O0FBRWhCLGlCQUFnQjtBQUNoQixrQkFBaUI7O0FBRWpCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDbEVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkIsUUFBUTtBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWE7QUFDYjs7QUFFQTtBQUNBLGVBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQztBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDdmVBLGlCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUN4SEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7QUM5RUEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7O0FBRVg7QUFDQTtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBNkIsTUFBTTtBQUNuQztBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQSxJQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsMkJBQTJCO0FBQzlDLHNCQUFxQiwrQ0FBK0M7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFtQiwyQkFBMkI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0Esc0JBQXFCLDRCQUE0QjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7OztBQ3huQ0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM5R0EsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFXLE1BQU07QUFDakI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQSxZQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0EsWUFBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBbUIsT0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBVyxNQUFNO0FBQ2pCO0FBQ0EsWUFBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqSEEsaUJBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQW9CO0FBQ3BCO0FBQ0E7QUFDQSx1Q0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxZQUFXO0FBQ1g7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsNkNBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxjQUFhO0FBQ2I7QUFDQSxZQUFXO0FBQ1g7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNIO0FBQ0E7QUFDQSxJQUFHOztBQUVILFdBQVU7QUFDVjs7QUFFQSIsImZpbGUiOiJzb3VyY2UtbWFwLmRlYnVnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic291cmNlTWFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInNvdXJjZU1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxNjI0YzcyOTliODg3ZjdiZGY2NCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zb3VyY2UtbWFwLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC12bHEuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2Jhc2U2NC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL3V0aWwuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbGliL2FycmF5LXNldC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL2xpYi9tYXBwaW5nLWxpc3QuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW1hcC1jb25zdW1lci5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvYmluYXJ5LXNlYXJjaC5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvcXVpY2stc29ydC5qc1xuLy8gbW9kdWxlIGlkID0gOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9saWIvc291cmNlLW5vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/node_modules/csso/node_modules/source-map/dist/source-map.js b/node_modules/csso/node_modules/source-map/dist/source-map.js
new file mode 100644
index 0000000..b4eb087
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/dist/source-map.js
@@ -0,0 +1,3233 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["sourceMap"] = factory();
+ else
+ root["sourceMap"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+
+
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+ exports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
+ exports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;
+ exports.SourceNode = __webpack_require__(10).SourceNode;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var base64VLQ = __webpack_require__(2);
+ var util = __webpack_require__(4);
+ var ArraySet = __webpack_require__(5).ArraySet;
+ var MappingList = __webpack_require__(6).MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source)
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = ''
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+ exports.SourceMapGenerator = SourceMapGenerator;
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var base64 = __webpack_require__(3);
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+ };
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ exports.encode = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+
+ /**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+ exports.decode = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+ };
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+ }
+ exports.relative = relative;
+
+ var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+ }());
+
+ function identity (s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto ? identity : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+ var has = Object.prototype.hasOwnProperty;
+ var hasNativeMap = typeof Map !== "undefined";
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ ArraySet.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ exports.ArraySet = ArraySet;
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ exports.MappingList = MappingList;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(4);
+ var binarySearch = __webpack_require__(8);
+ var ArraySet = __webpack_require__(5).ArraySet;
+ var base64VLQ = __webpack_require__(2);
+ var quickSort = __webpack_require__(9).quickSort;
+
+ function SourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ }
+
+ SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer.prototype._version = 3;
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+
+ SourceMapConsumer.prototype.__generatedMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+ });
+
+ SourceMapConsumer.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ SourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+ SourceMapConsumer.GENERATED_ORDER = 1;
+ SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+ SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+ SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ SourceMapConsumer.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ SourceMapConsumer.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+ exports.SourceMapConsumer = SourceMapConsumer;
+
+ /**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ BasicSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+ });
+
+ /**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+ function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64VLQ.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+ exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+ /**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+ }
+
+ IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+ IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ IndexedSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+ });
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ exports.GREATEST_LOWER_BOUND = 1;
+ exports.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+ };
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ // It turns out that some (most?) JavaScript engines don't self-host
+ // `Array.prototype.sort`. This makes sense because C++ will likely remain
+ // faster than JS when doing raw CPU-intensive sorting. However, when using a
+ // custom comparator function, calling back and forth between the VM's C++ and
+ // JIT'd JS is rather slow *and* loses JIT type information, resulting in
+ // worse generated code for the comparator function than would be optimal. In
+ // fact, when sorting with a comparator, these costs outweigh the benefits of
+ // sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+ // a ~3500ms mean speed-up in `bench/bench.html`.
+
+ /**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+ function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+ }
+
+ /**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+ function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+ }
+
+ /**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+ function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+ }
+
+ /**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+ exports.quickSort = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+ };
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;
+ var util = __webpack_require__(4);
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ var REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ var NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ var isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ SourceNode.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+ };
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ };
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+ };
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ SourceNode.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+ };
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+ };
+
+ exports.SourceNode = SourceNode;
+
+
+/***/ })
+/******/ ])
+});
+;
\ No newline at end of file
diff --git a/node_modules/csso/node_modules/source-map/dist/source-map.min.js b/node_modules/csso/node_modules/source-map/dist/source-map.min.js
new file mode 100644
index 0000000..c7c72da
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/dist/source-map.min.js
@@ -0,0 +1,2 @@
+!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.sourceMap=n():e.sourceMap=n()}(this,function(){return function(e){function n(t){if(r[t])return r[t].exports;var o=r[t]={exports:{},id:t,loaded:!1};return e[t].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n,r){n.SourceMapGenerator=r(1).SourceMapGenerator,n.SourceMapConsumer=r(7).SourceMapConsumer,n.SourceNode=r(10).SourceNode},function(e,n,r){function t(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new s,this._names=new s,this._mappings=new a,this._sourcesContents=null}var o=r(2),i=r(4),s=r(5).ArraySet,a=r(6).MappingList;t.prototype._version=3,t.fromSourceMap=function(e){var n=e.sourceRoot,r=new t({file:e.file,sourceRoot:n});return e.eachMapping(function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(t.source=e.source,null!=n&&(t.source=i.relative(n,t.source)),t.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(t.name=e.name)),r.addMapping(t)}),e.sources.forEach(function(t){var o=t;null!==n&&(o=i.relative(n,t)),r._sources.has(o)||r._sources.add(o);var s=e.sourceContentFor(t);null!=s&&r.setSourceContent(t,s)}),r},t.prototype.addMapping=function(e){var n=i.getArg(e,"generated"),r=i.getArg(e,"original",null),t=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(n,r,t,o),null!=t&&(t=String(t),this._sources.has(t)||this._sources.add(t)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:n.line,generatedColumn:n.column,originalLine:null!=r&&r.line,originalColumn:null!=r&&r.column,source:t,name:o})},t.prototype.setSourceContent=function(e,n){var r=e;null!=this._sourceRoot&&(r=i.relative(this._sourceRoot,r)),null!=n?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(r)]=n):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(r)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},t.prototype.applySourceMap=function(e,n,r){var t=n;if(null==n){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');t=e.file}var o=this._sourceRoot;null!=o&&(t=i.relative(o,t));var a=new s,u=new s;this._mappings.unsortedForEach(function(n){if(n.source===t&&null!=n.originalLine){var s=e.originalPositionFor({line:n.originalLine,column:n.originalColumn});null!=s.source&&(n.source=s.source,null!=r&&(n.source=i.join(r,n.source)),null!=o&&(n.source=i.relative(o,n.source)),n.originalLine=s.line,n.originalColumn=s.column,null!=s.name&&(n.name=s.name))}var l=n.source;null==l||a.has(l)||a.add(l);var c=n.name;null==c||u.has(c)||u.add(c)},this),this._sources=a,this._names=u,e.sources.forEach(function(n){var t=e.sourceContentFor(n);null!=t&&(null!=r&&(n=i.join(r,n)),null!=o&&(n=i.relative(o,n)),this.setSourceContent(n,t))},this)},t.prototype._validateMapping=function(e,n,r,t){if(n&&"number"!=typeof n.line&&"number"!=typeof n.column)throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||n||r||t)&&!(e&&"line"in e&&"column"in e&&n&&"line"in n&&"column"in n&&e.line>0&&e.column>=0&&n.line>0&&n.column>=0&&r))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:r,original:n,name:t}))},t.prototype._serializeMappings=function(){for(var e,n,r,t,s=0,a=1,u=0,l=0,c=0,g=0,p="",h=this._mappings.toArray(),f=0,d=h.length;f<d;f++){if(n=h[f],e="",n.generatedLine!==a)for(s=0;n.generatedLine!==a;)e+=";",a++;else if(f>0){if(!i.compareByGeneratedPositionsInflated(n,h[f-1]))continue;e+=","}e+=o.encode(n.generatedColumn-s),s=n.generatedColumn,null!=n.source&&(t=this._sources.indexOf(n.source),e+=o.encode(t-g),g=t,e+=o.encode(n.originalLine-1-l),l=n.originalLine-1,e+=o.encode(n.originalColumn-u),u=n.originalColumn,null!=n.name&&(r=this._names.indexOf(n.name),e+=o.encode(r-c),c=r)),p+=e}return p},t.prototype._generateSourcesContent=function(e,n){return e.map(function(e){if(!this._sourcesContents)return null;null!=n&&(e=i.relative(n,e));var r=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,r)?this._sourcesContents[r]:null},this)},t.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},t.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=t},function(e,n,r){function t(e){return e<0?(-e<<1)+1:(e<<1)+0}function o(e){var n=1===(1&e),r=e>>1;return n?-r:r}var i=r(3),s=5,a=1<<s,u=a-1,l=a;n.encode=function(e){var n,r="",o=t(e);do n=o&u,o>>>=s,o>0&&(n|=l),r+=i.encode(n);while(o>0);return r},n.decode=function(e,n,r){var t,a,c=e.length,g=0,p=0;do{if(n>=c)throw new Error("Expected more digits in base 64 VLQ value.");if(a=i.decode(e.charCodeAt(n++)),a===-1)throw new Error("Invalid base64 digit: "+e.charAt(n-1));t=!!(a&l),a&=u,g+=a<<p,p+=s}while(t);r.value=o(g),r.rest=n}},function(e,n){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");n.encode=function(e){if(0<=e&&e<r.length)return r[e];throw new TypeError("Must be between 0 and 63: "+e)},n.decode=function(e){var n=65,r=90,t=97,o=122,i=48,s=57,a=43,u=47,l=26,c=52;return n<=e&&e<=r?e-n:t<=e&&e<=o?e-t+l:i<=e&&e<=s?e-i+c:e==a?62:e==u?63:-1}},function(e,n){function r(e,n,r){if(n in e)return e[n];if(3===arguments.length)return r;throw new Error('"'+n+'" is a required argument.')}function t(e){var n=e.match(v);return n?{scheme:n[1],auth:n[2],host:n[3],port:n[4],path:n[5]}:null}function o(e){var n="";return e.scheme&&(n+=e.scheme+":"),n+="//",e.auth&&(n+=e.auth+"@"),e.host&&(n+=e.host),e.port&&(n+=":"+e.port),e.path&&(n+=e.path),n}function i(e){var r=e,i=t(e);if(i){if(!i.path)return e;r=i.path}for(var s,a=n.isAbsolute(r),u=r.split(/\/+/),l=0,c=u.length-1;c>=0;c--)s=u[c],"."===s?u.splice(c,1):".."===s?l++:l>0&&(""===s?(u.splice(c+1,l),l=0):(u.splice(c,2),l--));return r=u.join("/"),""===r&&(r=a?"/":"."),i?(i.path=r,o(i)):r}function s(e,n){""===e&&(e="."),""===n&&(n=".");var r=t(n),s=t(e);if(s&&(e=s.path||"/"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||n.match(y))return n;if(s&&!s.host&&!s.path)return s.host=n,o(s);var a="/"===n.charAt(0)?n:i(e.replace(/\/+$/,"")+"/"+n);return s?(s.path=a,o(s)):a}function a(e,n){""===e&&(e="."),e=e.replace(/\/$/,"");for(var r=0;0!==n.indexOf(e+"/");){var t=e.lastIndexOf("/");if(t<0)return n;if(e=e.slice(0,t),e.match(/^([^\/]+:\/)?\/*$/))return n;++r}return Array(r+1).join("../")+n.substr(e.length+1)}function u(e){return e}function l(e){return g(e)?"$"+e:e}function c(e){return g(e)?e.slice(1):e}function g(e){if(!e)return!1;var n=e.length;if(n<9)return!1;if(95!==e.charCodeAt(n-1)||95!==e.charCodeAt(n-2)||111!==e.charCodeAt(n-3)||116!==e.charCodeAt(n-4)||111!==e.charCodeAt(n-5)||114!==e.charCodeAt(n-6)||112!==e.charCodeAt(n-7)||95!==e.charCodeAt(n-8)||95!==e.charCodeAt(n-9))return!1;for(var r=n-10;r>=0;r--)if(36!==e.charCodeAt(r))return!1;return!0}function p(e,n,r){var t=f(e.source,n.source);return 0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t||r?t:(t=e.generatedColumn-n.generatedColumn,0!==t?t:(t=e.generatedLine-n.generatedLine,0!==t?t:f(e.name,n.name)))))}function h(e,n,r){var t=e.generatedLine-n.generatedLine;return 0!==t?t:(t=e.generatedColumn-n.generatedColumn,0!==t||r?t:(t=f(e.source,n.source),0!==t?t:(t=e.originalLine-n.originalLine,0!==t?t:(t=e.originalColumn-n.originalColumn,0!==t?t:f(e.name,n.name)))))}function f(e,n){return e===n?0:null===e?1:null===n?-1:e>n?1:-1}function d(e,n){var r=e.generatedLine-n.generatedLine;return 0!==r?r:(r=e.generatedColumn-n.generatedColumn,0!==r?r:(r=f(e.source,n.source),0!==r?r:(r=e.originalLine-n.originalLine,0!==r?r:(r=e.originalColumn-n.originalColumn,0!==r?r:f(e.name,n.name)))))}function m(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}function _(e,n,r){if(n=n||"",e&&("/"!==e[e.length-1]&&"/"!==n[0]&&(e+="/"),n=e+n),r){var a=t(r);if(!a)throw new Error("sourceMapURL could not be parsed");if(a.path){var u=a.path.lastIndexOf("/");u>=0&&(a.path=a.path.substring(0,u+1))}n=s(o(a),n)}return i(n)}n.getArg=r;var v=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,y=/^data:.+\,.+$/;n.urlParse=t,n.urlGenerate=o,n.normalize=i,n.join=s,n.isAbsolute=function(e){return"/"===e.charAt(0)||v.test(e)},n.relative=a;var C=function(){var e=Object.create(null);return!("__proto__"in e)}();n.toSetString=C?u:l,n.fromSetString=C?u:c,n.compareByOriginalPositions=p,n.compareByGeneratedPositionsDeflated=h,n.compareByGeneratedPositionsInflated=d,n.parseSourceMapInput=m,n.computeSourceURL=_},function(e,n,r){function t(){this._array=[],this._set=s?new Map:Object.create(null)}var o=r(4),i=Object.prototype.hasOwnProperty,s="undefined"!=typeof Map;t.fromArray=function(e,n){for(var r=new t,o=0,i=e.length;o<i;o++)r.add(e[o],n);return r},t.prototype.size=function(){return s?this._set.size:Object.getOwnPropertyNames(this._set).length},t.prototype.add=function(e,n){var r=s?e:o.toSetString(e),t=s?this.has(e):i.call(this._set,r),a=this._array.length;t&&!n||this._array.push(e),t||(s?this._set.set(e,a):this._set[r]=a)},t.prototype.has=function(e){if(s)return this._set.has(e);var n=o.toSetString(e);return i.call(this._set,n)},t.prototype.indexOf=function(e){if(s){var n=this._set.get(e);if(n>=0)return n}else{var r=o.toSetString(e);if(i.call(this._set,r))return this._set[r]}throw new Error('"'+e+'" is not in the set.')},t.prototype.at=function(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)},t.prototype.toArray=function(){return this._array.slice()},n.ArraySet=t},function(e,n,r){function t(e,n){var r=e.generatedLine,t=n.generatedLine,o=e.generatedColumn,s=n.generatedColumn;return t>r||t==r&&s>=o||i.compareByGeneratedPositionsInflated(e,n)<=0}function o(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}var i=r(4);o.prototype.unsortedForEach=function(e,n){this._array.forEach(e,n)},o.prototype.add=function(e){t(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))},o.prototype.toArray=function(){return this._sorted||(this._array.sort(i.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=o},function(e,n,r){function t(e,n){var r=e;return"string"==typeof e&&(r=a.parseSourceMapInput(e)),null!=r.sections?new s(r,n):new o(r,n)}function o(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var t=a.getArg(r,"version"),o=a.getArg(r,"sources"),i=a.getArg(r,"names",[]),s=a.getArg(r,"sourceRoot",null),u=a.getArg(r,"sourcesContent",null),c=a.getArg(r,"mappings"),g=a.getArg(r,"file",null);if(t!=this._version)throw new Error("Unsupported version: "+t);s&&(s=a.normalize(s)),o=o.map(String).map(a.normalize).map(function(e){return s&&a.isAbsolute(s)&&a.isAbsolute(e)?a.relative(s,e):e}),this._names=l.fromArray(i.map(String),!0),this._sources=l.fromArray(o,!0),this._absoluteSources=this._sources.toArray().map(function(e){return a.computeSourceURL(s,e,n)}),this.sourceRoot=s,this.sourcesContent=u,this._mappings=c,this._sourceMapURL=n,this.file=g}function i(){this.generatedLine=0,this.generatedColumn=0,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}function s(e,n){var r=e;"string"==typeof e&&(r=a.parseSourceMapInput(e));var o=a.getArg(r,"version"),i=a.getArg(r,"sections");if(o!=this._version)throw new Error("Unsupported version: "+o);this._sources=new l,this._names=new l;var s={line:-1,column:0};this._sections=i.map(function(e){if(e.url)throw new Error("Support for url field in sections not implemented.");var r=a.getArg(e,"offset"),o=a.getArg(r,"line"),i=a.getArg(r,"column");if(o<s.line||o===s.line&&i<s.column)throw new Error("Section offsets must be ordered and non-overlapping.");return s=r,{generatedOffset:{generatedLine:o+1,generatedColumn:i+1},consumer:new t(a.getArg(e,"map"),n)}})}var a=r(4),u=r(8),l=r(5).ArraySet,c=r(2),g=r(9).quickSort;t.fromSourceMap=function(e,n){return o.fromSourceMap(e,n)},t.prototype._version=3,t.prototype.__generatedMappings=null,Object.defineProperty(t.prototype,"_generatedMappings",{configurable:!0,enumerable:!0,get:function(){return this.__generatedMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__generatedMappings}}),t.prototype.__originalMappings=null,Object.defineProperty(t.prototype,"_originalMappings",{configurable:!0,enumerable:!0,get:function(){return this.__originalMappings||this._parseMappings(this._mappings,this.sourceRoot),this.__originalMappings}}),t.prototype._charIsMappingSeparator=function(e,n){var r=e.charAt(n);return";"===r||","===r},t.prototype._parseMappings=function(e,n){throw new Error("Subclasses must implement _parseMappings")},t.GENERATED_ORDER=1,t.ORIGINAL_ORDER=2,t.GREATEST_LOWER_BOUND=1,t.LEAST_UPPER_BOUND=2,t.prototype.eachMapping=function(e,n,r){var o,i=n||null,s=r||t.GENERATED_ORDER;switch(s){case t.GENERATED_ORDER:o=this._generatedMappings;break;case t.ORIGINAL_ORDER:o=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}var u=this.sourceRoot;o.map(function(e){var n=null===e.source?null:this._sources.at(e.source);return n=a.computeSourceURL(u,n,this._sourceMapURL),{source:n,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:null===e.name?null:this._names.at(e.name)}},this).forEach(e,i)},t.prototype.allGeneratedPositionsFor=function(e){var n=a.getArg(e,"line"),r={source:a.getArg(e,"source"),originalLine:n,originalColumn:a.getArg(e,"column",0)};if(r.source=this._findSourceIndex(r.source),r.source<0)return[];var t=[],o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,u.LEAST_UPPER_BOUND);if(o>=0){var i=this._originalMappings[o];if(void 0===e.column)for(var s=i.originalLine;i&&i.originalLine===s;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o];else for(var l=i.originalColumn;i&&i.originalLine===n&&i.originalColumn==l;)t.push({line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}),i=this._originalMappings[++o]}return t},n.SourceMapConsumer=t,o.prototype=Object.create(t.prototype),o.prototype.consumer=t,o.prototype._findSourceIndex=function(e){var n=e;if(null!=this.sourceRoot&&(n=a.relative(this.sourceRoot,n)),this._sources.has(n))return this._sources.indexOf(n);var r;for(r=0;r<this._absoluteSources.length;++r)if(this._absoluteSources[r]==e)return r;return-1},o.fromSourceMap=function(e,n){var r=Object.create(o.prototype),t=r._names=l.fromArray(e._names.toArray(),!0),s=r._sources=l.fromArray(e._sources.toArray(),!0);r.sourceRoot=e._sourceRoot,r.sourcesContent=e._generateSourcesContent(r._sources.toArray(),r.sourceRoot),r.file=e._file,r._sourceMapURL=n,r._absoluteSources=r._sources.toArray().map(function(e){return a.computeSourceURL(r.sourceRoot,e,n)});for(var u=e._mappings.toArray().slice(),c=r.__generatedMappings=[],p=r.__originalMappings=[],h=0,f=u.length;h<f;h++){var d=u[h],m=new i;m.generatedLine=d.generatedLine,m.generatedColumn=d.generatedColumn,d.source&&(m.source=s.indexOf(d.source),m.originalLine=d.originalLine,m.originalColumn=d.originalColumn,d.name&&(m.name=t.indexOf(d.name)),p.push(m)),c.push(m)}return g(r.__originalMappings,a.compareByOriginalPositions),r},o.prototype._version=3,Object.defineProperty(o.prototype,"sources",{get:function(){return this._absoluteSources.slice()}}),o.prototype._parseMappings=function(e,n){for(var r,t,o,s,u,l=1,p=0,h=0,f=0,d=0,m=0,_=e.length,v=0,y={},C={},S=[],A=[];v<_;)if(";"===e.charAt(v))l++,v++,p=0;else if(","===e.charAt(v))v++;else{for(r=new i,r.generatedLine=l,s=v;s<_&&!this._charIsMappingSeparator(e,s);s++);if(t=e.slice(v,s),o=y[t])v+=t.length;else{for(o=[];v<s;)c.decode(e,v,C),u=C.value,v=C.rest,o.push(u);if(2===o.length)throw new Error("Found a source, but no line and column");if(3===o.length)throw new Error("Found a source and line, but no column");y[t]=o}r.generatedColumn=p+o[0],p=r.generatedColumn,o.length>1&&(r.source=d+o[1],d+=o[1],r.originalLine=h+o[2],h=r.originalLine,r.originalLine+=1,r.originalColumn=f+o[3],f=r.originalColumn,o.length>4&&(r.name=m+o[4],m+=o[4])),A.push(r),"number"==typeof r.originalLine&&S.push(r)}g(A,a.compareByGeneratedPositionsDeflated),this.__generatedMappings=A,g(S,a.compareByOriginalPositions),this.__originalMappings=S},o.prototype._findMapping=function(e,n,r,t,o,i){if(e[r]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[r]);if(e[t]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[t]);return u.search(e,n,o,i)},o.prototype.computeColumnSpans=function(){for(var e=0;e<this._generatedMappings.length;++e){var n=this._generatedMappings[e];if(e+1<this._generatedMappings.length){var r=this._generatedMappings[e+1];if(n.generatedLine===r.generatedLine){n.lastGeneratedColumn=r.generatedColumn-1;continue}}n.lastGeneratedColumn=1/0}},o.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=this._findMapping(n,this._generatedMappings,"generatedLine","generatedColumn",a.compareByGeneratedPositionsDeflated,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(r>=0){var o=this._generatedMappings[r];if(o.generatedLine===n.generatedLine){var i=a.getArg(o,"source",null);null!==i&&(i=this._sources.at(i),i=a.computeSourceURL(this.sourceRoot,i,this._sourceMapURL));var s=a.getArg(o,"name",null);return null!==s&&(s=this._names.at(s)),{source:i,line:a.getArg(o,"originalLine",null),column:a.getArg(o,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},o.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return null==e}))},o.prototype.sourceContentFor=function(e,n){if(!this.sourcesContent)return null;var r=this._findSourceIndex(e);if(r>=0)return this.sourcesContent[r];var t=e;null!=this.sourceRoot&&(t=a.relative(this.sourceRoot,t));var o;if(null!=this.sourceRoot&&(o=a.urlParse(this.sourceRoot))){var i=t.replace(/^file:\/\//,"");if("file"==o.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!o.path||"/"==o.path)&&this._sources.has("/"+t))return this.sourcesContent[this._sources.indexOf("/"+t)]}if(n)return null;throw new Error('"'+t+'" is not in the SourceMap.')},o.prototype.generatedPositionFor=function(e){var n=a.getArg(e,"source");if(n=this._findSourceIndex(n),n<0)return{line:null,column:null,lastColumn:null};var r={source:n,originalLine:a.getArg(e,"line"),originalColumn:a.getArg(e,"column")},o=this._findMapping(r,this._originalMappings,"originalLine","originalColumn",a.compareByOriginalPositions,a.getArg(e,"bias",t.GREATEST_LOWER_BOUND));if(o>=0){var i=this._originalMappings[o];if(i.source===r.source)return{line:a.getArg(i,"generatedLine",null),column:a.getArg(i,"generatedColumn",null),lastColumn:a.getArg(i,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},n.BasicSourceMapConsumer=o,s.prototype=Object.create(t.prototype),s.prototype.constructor=t,s.prototype._version=3,Object.defineProperty(s.prototype,"sources",{get:function(){for(var e=[],n=0;n<this._sections.length;n++)for(var r=0;r<this._sections[n].consumer.sources.length;r++)e.push(this._sections[n].consumer.sources[r]);return e}}),s.prototype.originalPositionFor=function(e){var n={generatedLine:a.getArg(e,"line"),generatedColumn:a.getArg(e,"column")},r=u.search(n,this._sections,function(e,n){var r=e.generatedLine-n.generatedOffset.generatedLine;return r?r:e.generatedColumn-n.generatedOffset.generatedColumn}),t=this._sections[r];return t?t.consumer.originalPositionFor({line:n.generatedLine-(t.generatedOffset.generatedLine-1),column:n.generatedColumn-(t.generatedOffset.generatedLine===n.generatedLine?t.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}},s.prototype.hasContentsOfAllSources=function(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})},s.prototype.sourceContentFor=function(e,n){for(var r=0;r<this._sections.length;r++){var t=this._sections[r],o=t.consumer.sourceContentFor(e,!0);if(o)return o}if(n)return null;throw new Error('"'+e+'" is not in the SourceMap.')},s.prototype.generatedPositionFor=function(e){for(var n=0;n<this._sections.length;n++){var r=this._sections[n];if(r.consumer._findSourceIndex(a.getArg(e,"source"))!==-1){var t=r.consumer.generatedPositionFor(e);if(t){var o={line:t.line+(r.generatedOffset.generatedLine-1),column:t.column+(r.generatedOffset.generatedLine===t.line?r.generatedOffset.generatedColumn-1:0)};return o}}}return{line:null,column:null}},s.prototype._parseMappings=function(e,n){this.__generatedMappings=[],this.__originalMappings=[];for(var r=0;r<this._sections.length;r++)for(var t=this._sections[r],o=t.consumer._generatedMappings,i=0;i<o.length;i++){var s=o[i],u=t.consumer._sources.at(s.source);u=a.computeSourceURL(t.consumer.sourceRoot,u,this._sourceMapURL),this._sources.add(u),u=this._sources.indexOf(u);var l=null;s.name&&(l=t.consumer._names.at(s.name),this._names.add(l),l=this._names.indexOf(l));var c={source:u,generatedLine:s.generatedLine+(t.generatedOffset.generatedLine-1),generatedColumn:s.generatedColumn+(t.generatedOffset.generatedLine===s.generatedLine?t.generatedOffset.generatedColumn-1:0),originalLine:s.originalLine,originalColumn:s.originalColumn,name:l};this.__generatedMappings.push(c),"number"==typeof c.originalLine&&this.__originalMappings.push(c)}g(this.__generatedMappings,a.compareByGeneratedPositionsDeflated),g(this.__originalMappings,a.compareByOriginalPositions)},n.IndexedSourceMapConsumer=s},function(e,n){function r(e,t,o,i,s,a){var u=Math.floor((t-e)/2)+e,l=s(o,i[u],!0);return 0===l?u:l>0?t-u>1?r(u,t,o,i,s,a):a==n.LEAST_UPPER_BOUND?t<i.length?t:-1:u:u-e>1?r(e,u,o,i,s,a):a==n.LEAST_UPPER_BOUND?u:e<0?-1:e}n.GREATEST_LOWER_BOUND=1,n.LEAST_UPPER_BOUND=2,n.search=function(e,t,o,i){if(0===t.length)return-1;var s=r(-1,t.length,e,t,o,i||n.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===o(t[s],t[s-1],!0);)--s;return s}},function(e,n){function r(e,n,r){var t=e[n];e[n]=e[r],e[r]=t}function t(e,n){return Math.round(e+Math.random()*(n-e))}function o(e,n,i,s){if(i<s){var a=t(i,s),u=i-1;r(e,a,s);for(var l=e[s],c=i;c<s;c++)n(e[c],l)<=0&&(u+=1,r(e,u,c));r(e,u+1,c);var g=u+1;o(e,n,i,g-1),o(e,n,g+1,s)}}n.quickSort=function(e,n){o(e,n,0,e.length-1)}},function(e,n,r){function t(e,n,r,t,o){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==n?null:n,this.source=null==r?null:r,this.name=null==o?null:o,this[u]=!0,null!=t&&this.add(t)}var o=r(1).SourceMapGenerator,i=r(4),s=/(\r?\n)/,a=10,u="$$$isSourceNode$$$";t.fromStringWithSourceMap=function(e,n,r){function o(e,n){if(null===e||void 0===e.source)a.add(n);else{var o=r?i.join(r,e.source):e.source;a.add(new t(e.originalLine,e.originalColumn,o,n,e.name))}}var a=new t,u=e.split(s),l=0,c=function(){function e(){return l<u.length?u[l++]:void 0}var n=e(),r=e()||"";return n+r},g=1,p=0,h=null;return n.eachMapping(function(e){if(null!==h){if(!(g<e.generatedLine)){var n=u[l]||"",r=n.substr(0,e.generatedColumn-p);return u[l]=n.substr(e.generatedColumn-p),p=e.generatedColumn,o(h,r),void(h=e)}o(h,c()),g++,p=0}for(;g<e.generatedLine;)a.add(c()),g++;if(p<e.generatedColumn){var n=u[l]||"";a.add(n.substr(0,e.generatedColumn)),u[l]=n.substr(e.generatedColumn),p=e.generatedColumn}h=e},this),l<u.length&&(h&&o(h,c()),a.add(u.splice(l).join(""))),n.sources.forEach(function(e){var t=n.sourceContentFor(e);null!=t&&(null!=r&&(e=i.join(r,e)),a.setSourceContent(e,t))}),a},t.prototype.add=function(e){if(Array.isArray(e))e.forEach(function(e){this.add(e)},this);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this},t.prototype.prepend=function(e){if(Array.isArray(e))for(var n=e.length-1;n>=0;n--)this.prepend(e[n]);else{if(!e[u]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},t.prototype.walk=function(e){for(var n,r=0,t=this.children.length;r<t;r++)n=this.children[r],n[u]?n.walk(e):""!==n&&e(n,{source:this.source,line:this.line,column:this.column,name:this.name})},t.prototype.join=function(e){var n,r,t=this.children.length;if(t>0){for(n=[],r=0;r<t-1;r++)n.push(this.children[r]),n.push(e);n.push(this.children[r]),this.children=n}return this},t.prototype.replaceRight=function(e,n){var r=this.children[this.children.length-1];return r[u]?r.replaceRight(e,n):"string"==typeof r?this.children[this.children.length-1]=r.replace(e,n):this.children.push("".replace(e,n)),this},t.prototype.setSourceContent=function(e,n){this.sourceContents[i.toSetString(e)]=n},t.prototype.walkSourceContents=function(e){for(var n=0,r=this.children.length;n<r;n++)this.children[n][u]&&this.children[n].walkSourceContents(e);for(var t=Object.keys(this.sourceContents),n=0,r=t.length;n<r;n++)e(i.fromSetString(t[n]),this.sourceContents[t[n]])},t.prototype.toString=function(){var e="";return this.walk(function(n){e+=n}),e},t.prototype.toStringWithSourceMap=function(e){var n={code:"",line:1,column:0},r=new o(e),t=!1,i=null,s=null,u=null,l=null;return this.walk(function(e,o){n.code+=e,null!==o.source&&null!==o.line&&null!==o.column?(i===o.source&&s===o.line&&u===o.column&&l===o.name||r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name}),i=o.source,s=o.line,u=o.column,l=o.name,t=!0):t&&(r.addMapping({generated:{line:n.line,column:n.column}}),i=null,t=!1);for(var c=0,g=e.length;c<g;c++)e.charCodeAt(c)===a?(n.line++,n.column=0,c+1===g?(i=null,t=!1):t&&r.addMapping({source:o.source,original:{line:o.line,column:o.column},generated:{line:n.line,column:n.column},name:o.name})):n.column++}),this.walkSourceContents(function(e,n){r.setSourceContent(e,n)}),{code:n.code,map:r}},n.SourceNode=t}])});
+//# sourceMappingURL=source-map.min.js.map
\ No newline at end of file
diff --git a/node_modules/csso/node_modules/source-map/dist/source-map.min.js.map b/node_modules/csso/node_modules/source-map/dist/source-map.min.js.map
new file mode 100644
index 0000000..d2cc86e
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/dist/source-map.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///source-map.min.js","webpack:///webpack/bootstrap 0fd5815da764db5fb9fe","webpack:///./source-map.js","webpack:///./lib/source-map-generator.js","webpack:///./lib/base64-vlq.js","webpack:///./lib/base64.js","webpack:///./lib/util.js","webpack:///./lib/array-set.js","webpack:///./lib/mapping-list.js","webpack:///./lib/source-map-consumer.js","webpack:///./lib/binary-search.js","webpack:///./lib/quick-sort.js","webpack:///./lib/source-node.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","SourceMapGenerator","SourceMapConsumer","SourceNode","aArgs","_file","util","getArg","_sourceRoot","_skipValidation","_sources","ArraySet","_names","_mappings","MappingList","_sourcesContents","base64VLQ","prototype","_version","fromSourceMap","aSourceMapConsumer","sourceRoot","generator","file","eachMapping","mapping","newMapping","generated","line","generatedLine","column","generatedColumn","source","relative","original","originalLine","originalColumn","name","addMapping","sources","forEach","sourceFile","sourceRelative","has","add","content","sourceContentFor","setSourceContent","_validateMapping","String","aSourceFile","aSourceContent","Object","create","toSetString","keys","length","applySourceMap","aSourceMapPath","Error","newSources","newNames","unsortedForEach","originalPositionFor","join","aGenerated","aOriginal","aSource","aName","JSON","stringify","_serializeMappings","next","nameIdx","sourceIdx","previousGeneratedColumn","previousGeneratedLine","previousOriginalColumn","previousOriginalLine","previousName","previousSource","result","mappings","toArray","i","len","compareByGeneratedPositionsInflated","encode","indexOf","_generateSourcesContent","aSources","aSourceRoot","map","key","hasOwnProperty","toJSON","version","names","sourcesContent","toString","toVLQSigned","aValue","fromVLQSigned","isNegative","shifted","base64","VLQ_BASE_SHIFT","VLQ_BASE","VLQ_BASE_MASK","VLQ_CONTINUATION_BIT","digit","encoded","vlq","decode","aStr","aIndex","aOutParam","continuation","strLen","shift","charCodeAt","charAt","value","rest","intToCharMap","split","number","TypeError","charCode","bigA","bigZ","littleA","littleZ","zero","nine","plus","slash","littleOffset","numberOffset","aDefaultValue","arguments","urlParse","aUrl","match","urlRegexp","scheme","auth","host","port","path","urlGenerate","aParsedUrl","url","normalize","aPath","part","isAbsolute","parts","up","splice","aRoot","aPathUrl","aRootUrl","dataUrlRegexp","joined","replace","level","index","lastIndexOf","slice","Array","substr","identity","s","isProtoString","fromSetString","compareByOriginalPositions","mappingA","mappingB","onlyCompareOriginal","cmp","strcmp","compareByGeneratedPositionsDeflated","onlyCompareGenerated","aStr1","aStr2","parseSourceMapInput","str","parse","computeSourceURL","sourceURL","sourceMapURL","parsed","substring","test","supportsNullProto","obj","_array","_set","hasNativeMap","Map","fromArray","aArray","aAllowDuplicates","set","size","getOwnPropertyNames","sStr","isDuplicate","idx","push","get","at","aIdx","generatedPositionAfter","lineA","lineB","columnA","columnB","_sorted","_last","aCallback","aThisArg","aMapping","sort","aSourceMap","aSourceMapURL","sourceMap","sections","IndexedSourceMapConsumer","BasicSourceMapConsumer","_absoluteSources","_sourceMapURL","Mapping","lastOffset","_sections","offset","offsetLine","offsetColumn","generatedOffset","consumer","binarySearch","quickSort","__generatedMappings","defineProperty","configurable","enumerable","_parseMappings","__originalMappings","_charIsMappingSeparator","GENERATED_ORDER","ORIGINAL_ORDER","GREATEST_LOWER_BOUND","LEAST_UPPER_BOUND","aContext","aOrder","context","order","_generatedMappings","_originalMappings","allGeneratedPositionsFor","needle","_findSourceIndex","_findMapping","undefined","lastColumn","relativeSource","smc","generatedMappings","destGeneratedMappings","destOriginalMappings","srcMapping","destMapping","segment","end","cachedSegments","temp","originalMappings","aNeedle","aMappings","aLineName","aColumnName","aComparator","aBias","search","computeColumnSpans","nextMapping","lastGeneratedColumn","Infinity","hasContentsOfAllSources","some","sc","nullOnMissing","fileUriAbsPath","generatedPositionFor","constructor","j","sectionIndex","section","bias","every","generatedPosition","ret","sectionMappings","adjustedMapping","recursiveSearch","aLow","aHigh","aHaystack","aCompare","mid","Math","floor","swap","ary","x","y","randomIntInRange","low","high","round","random","doQuickSort","comparator","r","pivotIndex","pivot","q","aLine","aColumn","aChunks","children","sourceContents","isSourceNode","REGEX_NEWLINE","NEWLINE_CODE","fromStringWithSourceMap","aGeneratedCode","aRelativePath","addMappingWithCode","code","node","remainingLines","remainingLinesIndex","shiftNextLine","getNextLine","lineContents","newLine","lastGeneratedLine","lastMapping","nextLine","aChunk","isArray","chunk","prepend","unshift","walk","aFn","aSep","newChildren","replaceRight","aPattern","aReplacement","lastChild","walkSourceContents","toStringWithSourceMap","sourceMappingActive","lastOriginalSource","lastOriginalLine","lastOriginalColumn","lastOriginalName","sourceContent"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,UAAAD,IAEAD,EAAA,UAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAAUL,EAAQD,EAASM,GEjDjCN,EAAAe,mBAAAT,EAAA,GAAAS,mBACAf,EAAAgB,kBAAAV,EAAA,GAAAU,kBACAhB,EAAAiB,WAAAX,EAAA,IAAAW,YF6DM,SAAUhB,EAAQD,EAASM,GGhDjC,QAAAS,GAAAG,GACAA,IACAA,MAEAd,KAAAe,MAAAC,EAAAC,OAAAH,EAAA,aACAd,KAAAkB,YAAAF,EAAAC,OAAAH,EAAA,mBACAd,KAAAmB,gBAAAH,EAAAC,OAAAH,EAAA,qBACAd,KAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,GACArB,KAAAuB,UAAA,GAAAC,GACAxB,KAAAyB,iBAAA,KAvBA,GAAAC,GAAAxB,EAAA,GACAc,EAAAd,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAG,EAAAtB,EAAA,GAAAsB,WAuBAb,GAAAgB,UAAAC,SAAA,EAOAjB,EAAAkB,cACA,SAAAC,GACA,GAAAC,GAAAD,EAAAC,WACAC,EAAA,GAAArB,IACAsB,KAAAH,EAAAG,KACAF,cA2CA,OAzCAD,GAAAI,YAAA,SAAAC,GACA,GAAAC,IACAC,WACAC,KAAAH,EAAAI,cACAC,OAAAL,EAAAM,iBAIA,OAAAN,EAAAO,SACAN,EAAAM,OAAAP,EAAAO,OACA,MAAAX,IACAK,EAAAM,OAAA1B,EAAA2B,SAAAZ,EAAAK,EAAAM,SAGAN,EAAAQ,UACAN,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAGA,MAAAX,EAAAY,OACAX,EAAAW,KAAAZ,EAAAY,OAIAf,EAAAgB,WAAAZ,KAEAN,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAC,GAAAD,CACA,QAAApB,IACAqB,EAAApC,EAAA2B,SAAAZ,EAAAoB,IAGAnB,EAAAZ,SAAAiC,IAAAD,IACApB,EAAAZ,SAAAkC,IAAAF,EAGA,IAAAG,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,GACAvB,EAAAyB,iBAAAN,EAAAI,KAGAvB,GAaArB,EAAAgB,UAAAqB,WACA,SAAAlC,GACA,GAAAuB,GAAArB,EAAAC,OAAAH,EAAA,aACA8B,EAAA5B,EAAAC,OAAAH,EAAA,iBACA4B,EAAA1B,EAAAC,OAAAH,EAAA,eACAiC,EAAA/B,EAAAC,OAAAH,EAAA,YAEAd,MAAAmB,iBACAnB,KAAA0D,iBAAArB,EAAAO,EAAAF,EAAAK,GAGA,MAAAL,IACAA,EAAAiB,OAAAjB,GACA1C,KAAAoB,SAAAiC,IAAAX,IACA1C,KAAAoB,SAAAkC,IAAAZ,IAIA,MAAAK,IACAA,EAAAY,OAAAZ,GACA/C,KAAAsB,OAAA+B,IAAAN,IACA/C,KAAAsB,OAAAgC,IAAAP,IAIA/C,KAAAuB,UAAA+B,KACAf,cAAAF,EAAAC,KACAG,gBAAAJ,EAAAG,OACAK,aAAA,MAAAD,KAAAN,KACAQ,eAAA,MAAAF,KAAAJ,OACAE,SACAK,UAOApC,EAAAgB,UAAA8B,iBACA,SAAAG,EAAAC,GACA,GAAAnB,GAAAkB,CACA,OAAA5D,KAAAkB,cACAwB,EAAA1B,EAAA2B,SAAA3C,KAAAkB,YAAAwB,IAGA,MAAAmB,GAGA7D,KAAAyB,mBACAzB,KAAAyB,iBAAAqC,OAAAC,OAAA,OAEA/D,KAAAyB,iBAAAT,EAAAgD,YAAAtB,IAAAmB,GACK7D,KAAAyB,yBAGLzB,MAAAyB,iBAAAT,EAAAgD,YAAAtB,IACA,IAAAoB,OAAAG,KAAAjE,KAAAyB,kBAAAyC,SACAlE,KAAAyB,iBAAA,QAqBAd,EAAAgB,UAAAwC,eACA,SAAArC,EAAA8B,EAAAQ,GACA,GAAAjB,GAAAS,CAEA,UAAAA,EAAA,CACA,SAAA9B,EAAAG,KACA,SAAAoC,OACA,gJAIAlB,GAAArB,EAAAG,KAEA,GAAAF,GAAA/B,KAAAkB,WAEA,OAAAa,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,GAIA,IAAAmB,GAAA,GAAAjD,GACAkD,EAAA,GAAAlD,EAGArB,MAAAuB,UAAAiD,gBAAA,SAAArC,GACA,GAAAA,EAAAO,SAAAS,GAAA,MAAAhB,EAAAU,aAAA,CAEA,GAAAD,GAAAd,EAAA2C,qBACAnC,KAAAH,EAAAU,aACAL,OAAAL,EAAAW,gBAEA,OAAAF,EAAAF,SAEAP,EAAAO,OAAAE,EAAAF,OACA,MAAA0B,IACAjC,EAAAO,OAAA1B,EAAA0D,KAAAN,EAAAjC,EAAAO,SAEA,MAAAX,IACAI,EAAAO,OAAA1B,EAAA2B,SAAAZ,EAAAI,EAAAO,SAEAP,EAAAU,aAAAD,EAAAN,KACAH,EAAAW,eAAAF,EAAAJ,OACA,MAAAI,EAAAG,OACAZ,EAAAY,KAAAH,EAAAG,OAKA,GAAAL,GAAAP,EAAAO,MACA,OAAAA,GAAA4B,EAAAjB,IAAAX,IACA4B,EAAAhB,IAAAZ,EAGA,IAAAK,GAAAZ,EAAAY,IACA,OAAAA,GAAAwB,EAAAlB,IAAAN,IACAwB,EAAAjB,IAAAP,IAGK/C,MACLA,KAAAoB,SAAAkD,EACAtE,KAAAsB,OAAAiD,EAGAzC,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAI,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,IACA,MAAAa,IACAjB,EAAAnC,EAAA0D,KAAAN,EAAAjB,IAEA,MAAApB,IACAoB,EAAAnC,EAAA2B,SAAAZ,EAAAoB,IAEAnD,KAAAyD,iBAAAN,EAAAI,KAEKvD,OAcLW,EAAAgB,UAAA+B,iBACA,SAAAiB,EAAAC,EAAAC,EACAC,GAKA,GAAAF,GAAA,gBAAAA,GAAAtC,MAAA,gBAAAsC,GAAApC,OACA,SAAA6B,OACA,+OAMA,OAAAM,GAAA,QAAAA,IAAA,UAAAA,IACAA,EAAArC,KAAA,GAAAqC,EAAAnC,QAAA,IACAoC,GAAAC,GAAAC,MAIAH,GAAA,QAAAA,IAAA,UAAAA,IACAC,GAAA,QAAAA,IAAA,UAAAA,IACAD,EAAArC,KAAA,GAAAqC,EAAAnC,QAAA,GACAoC,EAAAtC,KAAA,GAAAsC,EAAApC,QAAA,GACAqC,GAKA,SAAAR,OAAA,oBAAAU,KAAAC,WACA3C,UAAAsC,EACAjC,OAAAmC,EACAjC,SAAAgC,EACA7B,KAAA+B,MASAnE,EAAAgB,UAAAsD,mBACA,WAcA,OANAC,GACA/C,EACAgD,EACAC,EAVAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,EACAC,EAAA,GAMAC,EAAA5F,KAAAuB,UAAAsE,UACAC,EAAA,EAAAC,EAAAH,EAAA1B,OAA0C4B,EAAAC,EAASD,IAAA,CAInD,GAHA3D,EAAAyD,EAAAE,GACAZ,EAAA,GAEA/C,EAAAI,gBAAA+C,EAEA,IADAD,EAAA,EACAlD,EAAAI,gBAAA+C,GACAJ,GAAA,IACAI,QAIA,IAAAQ,EAAA,GACA,IAAA9E,EAAAgF,oCAAA7D,EAAAyD,EAAAE,EAAA,IACA,QAEAZ,IAAA,IAIAA,GAAAxD,EAAAuE,OAAA9D,EAAAM,gBACA4C,GACAA,EAAAlD,EAAAM,gBAEA,MAAAN,EAAAO,SACA0C,EAAApF,KAAAoB,SAAA8E,QAAA/D,EAAAO,QACAwC,GAAAxD,EAAAuE,OAAAb,EAAAM,GACAA,EAAAN,EAGAF,GAAAxD,EAAAuE,OAAA9D,EAAAU,aAAA,EACA2C,GACAA,EAAArD,EAAAU,aAAA,EAEAqC,GAAAxD,EAAAuE,OAAA9D,EAAAW,eACAyC,GACAA,EAAApD,EAAAW,eAEA,MAAAX,EAAAY,OACAoC,EAAAnF,KAAAsB,OAAA4E,QAAA/D,EAAAY,MACAmC,GAAAxD,EAAAuE,OAAAd,EAAAM,GACAA,EAAAN,IAIAQ,GAAAT,EAGA,MAAAS,IAGAhF,EAAAgB,UAAAwE,wBACA,SAAAC,EAAAC,GACA,MAAAD,GAAAE,IAAA,SAAA5D,GACA,IAAA1C,KAAAyB,iBACA,WAEA,OAAA4E,IACA3D,EAAA1B,EAAA2B,SAAA0D,EAAA3D,GAEA,IAAA6D,GAAAvF,EAAAgD,YAAAtB,EACA,OAAAoB,QAAAnC,UAAA6E,eAAAjG,KAAAP,KAAAyB,iBAAA8E,GACAvG,KAAAyB,iBAAA8E,GACA,MACKvG,OAMLW,EAAAgB,UAAA8E,OACA,WACA,GAAAH,IACAI,QAAA1G,KAAA4B,SACAqB,QAAAjD,KAAAoB,SAAAyE,UACAc,MAAA3G,KAAAsB,OAAAuE,UACAD,SAAA5F,KAAAiF,qBAYA,OAVA,OAAAjF,KAAAe,QACAuF,EAAArE,KAAAjC,KAAAe,OAEA,MAAAf,KAAAkB,cACAoF,EAAAvE,WAAA/B,KAAAkB,aAEAlB,KAAAyB,mBACA6E,EAAAM,eAAA5G,KAAAmG,wBAAAG,EAAArD,QAAAqD,EAAAvE,aAGAuE,GAMA3F,EAAAgB,UAAAkF,SACA,WACA,MAAA9B,MAAAC,UAAAhF,KAAAyG,WAGA7G,EAAAe,sBH2EM,SAAUd,EAAQD,EAASM,GI/ajC,QAAA4G,GAAAC,GACA,MAAAA,GAAA,IACAA,GAAA,MACAA,GAAA,KASA,QAAAC,GAAAD,GACA,GAAAE,GAAA,OAAAF,GACAG,EAAAH,GAAA,CACA,OAAAE,IACAC,EACAA,EAhDA,GAAAC,GAAAjH,EAAA,GAcAkH,EAAA,EAGAC,EAAA,GAAAD,EAGAE,EAAAD,EAAA,EAGAE,EAAAF,CA+BAzH,GAAAqG,OAAA,SAAAc,GACA,GACAS,GADAC,EAAA,GAGAC,EAAAZ,EAAAC,EAEA,GACAS,GAAAE,EAAAJ,EACAI,KAAAN,EACAM,EAAA,IAGAF,GAAAD,GAEAE,GAAAN,EAAAlB,OAAAuB,SACGE,EAAA,EAEH,OAAAD,IAOA7H,EAAA+H,OAAA,SAAAC,EAAAC,EAAAC,GACA,GAGAC,GAAAP,EAHAQ,EAAAJ,EAAA1D,OACAyB,EAAA,EACAsC,EAAA,CAGA,IACA,GAAAJ,GAAAG,EACA,SAAA3D,OAAA,6CAIA,IADAmD,EAAAL,EAAAQ,OAAAC,EAAAM,WAAAL,MACAL,KAAA,EACA,SAAAnD,OAAA,yBAAAuD,EAAAO,OAAAN,EAAA,GAGAE,MAAAP,EAAAD,GACAC,GAAAF,EACA3B,GAAA6B,GAAAS,EACAA,GAAAb,QACGW,EAEHD,GAAAM,MAAApB,EAAArB,GACAmC,EAAAO,KAAAR,IJ2fM,SAAUhI,EAAQD,GK9nBxB,GAAA0I,GAAA,mEAAAC,MAAA,GAKA3I,GAAAqG,OAAA,SAAAuC,GACA,MAAAA,KAAAF,EAAApE,OACA,MAAAoE,GAAAE,EAEA,UAAAC,WAAA,6BAAAD,IAOA5I,EAAA+H,OAAA,SAAAe,GACA,GAAAC,GAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,IAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,GAEAC,EAAA,GACAC,EAAA,EAGA,OAAAT,IAAAD,MAAAE,EACAF,EAAAC,EAIAE,GAAAH,MAAAI,EACAJ,EAAAG,EAAAM,EAIAJ,GAAAL,MAAAM,EACAN,EAAAK,EAAAK,EAIAV,GAAAO,EACA,GAIAP,GAAAQ,EACA,IAIA,IL6oBM,SAAUrJ,EAAQD,GM7rBxB,QAAAqB,GAAAH,EAAAgE,EAAAuE,GACA,GAAAvE,IAAAhE,GACA,MAAAA,GAAAgE,EACG,QAAAwE,UAAApF,OACH,MAAAmF,EAEA,UAAAhF,OAAA,IAAAS,EAAA,6BAQA,QAAAyE,GAAAC,GACA,GAAAC,GAAAD,EAAAC,MAAAC,EACA,OAAAD,IAIAE,OAAAF,EAAA,GACAG,KAAAH,EAAA,GACAI,KAAAJ,EAAA,GACAK,KAAAL,EAAA,GACAM,KAAAN,EAAA,IAPA,KAYA,QAAAO,GAAAC,GACA,GAAAC,GAAA,EAiBA,OAhBAD,GAAAN,SACAO,GAAAD,EAAAN,OAAA,KAEAO,GAAA,KACAD,EAAAL,OACAM,GAAAD,EAAAL,KAAA,KAEAK,EAAAJ,OACAK,GAAAD,EAAAJ,MAEAI,EAAAH,OACAI,GAAA,IAAAD,EAAAH,MAEAG,EAAAF,OACAG,GAAAD,EAAAF,MAEAG,EAeA,QAAAC,GAAAC,GACA,GAAAL,GAAAK,EACAF,EAAAX,EAAAa,EACA,IAAAF,EAAA,CACA,IAAAA,EAAAH,KACA,MAAAK,EAEAL,GAAAG,EAAAH,KAKA,OAAAM,GAHAC,EAAA1K,EAAA0K,WAAAP,GAEAQ,EAAAR,EAAAxB,MAAA,OACAiC,EAAA,EAAA1E,EAAAyE,EAAArG,OAAA,EAA8C4B,GAAA,EAAQA,IACtDuE,EAAAE,EAAAzE,GACA,MAAAuE,EACAE,EAAAE,OAAA3E,EAAA,GACK,OAAAuE,EACLG,IACKA,EAAA,IACL,KAAAH,GAIAE,EAAAE,OAAA3E,EAAA,EAAA0E,GACAA,EAAA,IAEAD,EAAAE,OAAA3E,EAAA,GACA0E,KAUA,OANAT,GAAAQ,EAAA7F,KAAA,KAEA,KAAAqF,IACAA,EAAAO,EAAA,SAGAJ,GACAA,EAAAH,OACAC,EAAAE,IAEAH,EAoBA,QAAArF,GAAAgG,EAAAN,GACA,KAAAM,IACAA,EAAA,KAEA,KAAAN,IACAA,EAAA,IAEA,IAAAO,GAAApB,EAAAa,GACAQ,EAAArB,EAAAmB,EAMA,IALAE,IACAF,EAAAE,EAAAb,MAAA,KAIAY,MAAAhB,OAIA,MAHAiB,KACAD,EAAAhB,OAAAiB,EAAAjB,QAEAK,EAAAW,EAGA,IAAAA,GAAAP,EAAAX,MAAAoB,GACA,MAAAT,EAIA,IAAAQ,MAAAf,OAAAe,EAAAb,KAEA,MADAa,GAAAf,KAAAO,EACAJ,EAAAY,EAGA,IAAAE,GAAA,MAAAV,EAAAjC,OAAA,GACAiC,EACAD,EAAAO,EAAAK,QAAA,eAAAX,EAEA,OAAAQ,IACAA,EAAAb,KAAAe,EACAd,EAAAY,IAEAE,EAcA,QAAAnI,GAAA+H,EAAAN,GACA,KAAAM,IACAA,EAAA,KAGAA,IAAAK,QAAA,SAOA,KADA,GAAAC,GAAA,EACA,IAAAZ,EAAAlE,QAAAwE,EAAA,OACA,GAAAO,GAAAP,EAAAQ,YAAA,IACA,IAAAD,EAAA,EACA,MAAAb,EAOA,IADAM,IAAAS,MAAA,EAAAF,GACAP,EAAAjB,MAAA,qBACA,MAAAW,KAGAY,EAIA,MAAAI,OAAAJ,EAAA,GAAAtG,KAAA,OAAA0F,EAAAiB,OAAAX,EAAAxG,OAAA,GASA,QAAAoH,GAAAC,GACA,MAAAA,GAYA,QAAAvH,GAAA4D,GACA,MAAA4D,GAAA5D,GACA,IAAAA,EAGAA,EAIA,QAAA6D,GAAA7D,GACA,MAAA4D,GAAA5D,GACAA,EAAAuD,MAAA,GAGAvD,EAIA,QAAA4D,GAAAD,GACA,IAAAA,EACA,QAGA,IAAArH,GAAAqH,EAAArH,MAEA,IAAAA,EAAA,EACA,QAGA,SAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,MAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,IACA,KAAAqH,EAAArD,WAAAhE,EAAA,GACA,QAGA,QAAA4B,GAAA5B,EAAA,GAA2B4B,GAAA,EAAQA,IACnC,QAAAyF,EAAArD,WAAApC,GACA,QAIA,UAWA,QAAA4F,GAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,OACA,YAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,GAAAD,EACAC,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,EACAA,GAGAA,EAAAH,EAAApJ,cAAAqJ,EAAArJ,cACA,IAAAuJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UAaA,QAAAiJ,GAAAL,EAAAC,EAAAK,GACA,GAAAH,GAAAH,EAAApJ,cAAAqJ,EAAArJ,aACA,YAAAuJ,EACAA,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,GAAAG,EACAH,GAGAA,EAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,QACA,IAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UAIA,QAAAgJ,GAAAG,EAAAC,GACA,MAAAD,KAAAC,EACA,EAGA,OAAAD,EACA,EAGA,OAAAC,GACA,EAGAD,EAAAC,EACA,GAGA,EAOA,QAAAnG,GAAA2F,EAAAC,GACA,GAAAE,GAAAH,EAAApJ,cAAAqJ,EAAArJ,aACA,YAAAuJ,EACAA,GAGAA,EAAAH,EAAAlJ,gBAAAmJ,EAAAnJ,gBACA,IAAAqJ,EACAA,GAGAA,EAAAC,EAAAJ,EAAAjJ,OAAAkJ,EAAAlJ,QACA,IAAAoJ,EACAA,GAGAA,EAAAH,EAAA9I,aAAA+I,EAAA/I,aACA,IAAAiJ,EACAA,GAGAA,EAAAH,EAAA7I,eAAA8I,EAAA9I,eACA,IAAAgJ,EACAA,EAGAC,EAAAJ,EAAA5I,KAAA6I,EAAA7I,UASA,QAAAqJ,GAAAC,GACA,MAAAtH,MAAAuH,MAAAD,EAAAtB,QAAA,iBAAsC,KAQtC,QAAAwB,GAAAxK,EAAAyK,EAAAC,GA8BA,GA7BAD,KAAA,GAEAzK,IAEA,MAAAA,IAAAmC,OAAA,UAAAsI,EAAA,KACAzK,GAAA,KAOAyK,EAAAzK,EAAAyK,GAiBAC,EAAA,CACA,GAAAC,GAAAnD,EAAAkD,EACA,KAAAC,EACA,SAAArI,OAAA,mCAEA,IAAAqI,EAAA3C,KAAA,CAEA,GAAAkB,GAAAyB,EAAA3C,KAAAmB,YAAA,IACAD,IAAA,IACAyB,EAAA3C,KAAA2C,EAAA3C,KAAA4C,UAAA,EAAA1B,EAAA,IAGAuB,EAAA9H,EAAAsF,EAAA0C,GAAAF,GAGA,MAAArC,GAAAqC,GA3cA5M,EAAAqB,QAEA,IAAAyI,GAAA,iEACAmB,EAAA,eAeAjL,GAAA2J,WAsBA3J,EAAAoK,cAwDApK,EAAAuK,YA2DAvK,EAAA8E,OAEA9E,EAAA0K,WAAA,SAAAF,GACA,YAAAA,EAAAjC,OAAA,IAAAuB,EAAAkD,KAAAxC,IAyCAxK,EAAA+C,UAEA,IAAAkK,GAAA,WACA,GAAAC,GAAAhJ,OAAAC,OAAA,KACA,sBAAA+I,MAuBAlN,GAAAoE,YAAA6I,EAAAvB,EAAAtH,EASApE,EAAA6L,cAAAoB,EAAAvB,EAAAG,EAsEA7L,EAAA8L,6BAuCA9L,EAAAoM,sCAsDApM,EAAAoG,sCAUApG,EAAAwM,sBAqDAxM,EAAA2M,oBNqtBM,SAAU1M,EAAQD,EAASM,GO3qCjC,QAAAmB,KACArB,KAAA+M,UACA/M,KAAAgN,KAAAC,EAAA,GAAAC,KAAApJ,OAAAC,OAAA,MAZA,GAAA/C,GAAAd,EAAA,GACAmD,EAAAS,OAAAnC,UAAA6E,eACAyG,EAAA,mBAAAC,IAgBA7L,GAAA8L,UAAA,SAAAC,EAAAC,GAEA,OADAC,GAAA,GAAAjM,GACAyE,EAAA,EAAAC,EAAAqH,EAAAlJ,OAAsC4B,EAAAC,EAASD,IAC/CwH,EAAAhK,IAAA8J,EAAAtH,GAAAuH,EAEA,OAAAC,IASAjM,EAAAM,UAAA4L,KAAA,WACA,MAAAN,GAAAjN,KAAAgN,KAAAO,KAAAzJ,OAAA0J,oBAAAxN,KAAAgN,MAAA9I,QAQA7C,EAAAM,UAAA2B,IAAA,SAAAsE,EAAAyF,GACA,GAAAI,GAAAR,EAAArF,EAAA5G,EAAAgD,YAAA4D,GACA8F,EAAAT,EAAAjN,KAAAqD,IAAAuE,GAAAvE,EAAA9C,KAAAP,KAAAgN,KAAAS,GACAE,EAAA3N,KAAA+M,OAAA7I,MACAwJ,KAAAL,GACArN,KAAA+M,OAAAa,KAAAhG,GAEA8F,IACAT,EACAjN,KAAAgN,KAAAM,IAAA1F,EAAA+F,GAEA3N,KAAAgN,KAAAS,GAAAE,IAUAtM,EAAAM,UAAA0B,IAAA,SAAAuE,GACA,GAAAqF,EACA,MAAAjN,MAAAgN,KAAA3J,IAAAuE,EAEA,IAAA6F,GAAAzM,EAAAgD,YAAA4D,EACA,OAAAvE,GAAA9C,KAAAP,KAAAgN,KAAAS,IASApM,EAAAM,UAAAuE,QAAA,SAAA0B,GACA,GAAAqF,EAAA,CACA,GAAAU,GAAA3N,KAAAgN,KAAAa,IAAAjG,EACA,IAAA+F,GAAA,EACA,MAAAA,OAEG,CACH,GAAAF,GAAAzM,EAAAgD,YAAA4D,EACA,IAAAvE,EAAA9C,KAAAP,KAAAgN,KAAAS,GACA,MAAAzN,MAAAgN,KAAAS,GAIA,SAAApJ,OAAA,IAAAuD,EAAA,yBAQAvG,EAAAM,UAAAmM,GAAA,SAAAC,GACA,GAAAA,GAAA,GAAAA,EAAA/N,KAAA+M,OAAA7I,OACA,MAAAlE,MAAA+M,OAAAgB,EAEA,UAAA1J,OAAA,yBAAA0J,IAQA1M,EAAAM,UAAAkE,QAAA,WACA,MAAA7F,MAAA+M,OAAA5B,SAGAvL,EAAAyB,YPmsCM,SAAUxB,EAAQD,EAASM,GQ9yCjC,QAAA8N,GAAArC,EAAAC,GAEA,GAAAqC,GAAAtC,EAAApJ,cACA2L,EAAAtC,EAAArJ,cACA4L,EAAAxC,EAAAlJ,gBACA2L,EAAAxC,EAAAnJ,eACA,OAAAyL,GAAAD,GAAAC,GAAAD,GAAAG,GAAAD,GACAnN,EAAAgF,oCAAA2F,EAAAC,IAAA,EAQA,QAAApK,KACAxB,KAAA+M,UACA/M,KAAAqO,SAAA,EAEArO,KAAAsO,OAAgB/L,eAAA,EAAAE,gBAAA,GAzBhB,GAAAzB,GAAAd,EAAA,EAkCAsB,GAAAG,UAAA6C,gBACA,SAAA+J,EAAAC,GACAxO,KAAA+M,OAAA7J,QAAAqL,EAAAC,IAQAhN,EAAAG,UAAA2B,IAAA,SAAAmL,GACAT,EAAAhO,KAAAsO,MAAAG,IACAzO,KAAAsO,MAAAG,EACAzO,KAAA+M,OAAAa,KAAAa,KAEAzO,KAAAqO,SAAA,EACArO,KAAA+M,OAAAa,KAAAa,KAaAjN,EAAAG,UAAAkE,QAAA,WAKA,MAJA7F,MAAAqO,UACArO,KAAA+M,OAAA2B,KAAA1N,EAAAgF,qCACAhG,KAAAqO,SAAA,GAEArO,KAAA+M,QAGAnN,EAAA4B,eRk0CM,SAAU3B,EAAQD,EAASM,GSn4CjC,QAAAU,GAAA+N,EAAAC,GACA,GAAAC,GAAAF,CAKA,OAJA,gBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,IAGA,MAAAE,EAAAC,SACA,GAAAC,GAAAF,EAAAD,GACA,GAAAI,GAAAH,EAAAD,GA0QA,QAAAI,GAAAL,EAAAC,GACA,GAAAC,GAAAF,CACA,iBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,GAGA,IAAAjI,GAAA1F,EAAAC,OAAA4N,EAAA,WACA5L,EAAAjC,EAAAC,OAAA4N,EAAA,WAGAlI,EAAA3F,EAAAC,OAAA4N,EAAA,YACA9M,EAAAf,EAAAC,OAAA4N,EAAA,mBACAjI,EAAA5F,EAAAC,OAAA4N,EAAA,uBACAjJ,EAAA5E,EAAAC,OAAA4N,EAAA,YACA5M,EAAAjB,EAAAC,OAAA4N,EAAA,YAIA,IAAAnI,GAAA1G,KAAA4B,SACA,SAAAyC,OAAA,wBAAAqC,EAGA3E,KACAA,EAAAf,EAAAmJ,UAAApI,IAGAkB,IACAqD,IAAA3C,QAIA2C,IAAAtF,EAAAmJ,WAKA7D,IAAA,SAAA5D,GACA,MAAAX,IAAAf,EAAAsJ,WAAAvI,IAAAf,EAAAsJ,WAAA5H,GACA1B,EAAA2B,SAAAZ,EAAAW,GACAA,IAOA1C,KAAAsB,OAAAD,EAAA8L,UAAAxG,EAAAL,IAAA3C,SAAA,GACA3D,KAAAoB,SAAAC,EAAA8L,UAAAlK,GAAA,GAEAjD,KAAAiP,iBAAAjP,KAAAoB,SAAAyE,UAAAS,IAAA,SAAAiF,GACA,MAAAvK,GAAAuL,iBAAAxK,EAAAwJ,EAAAqD,KAGA5O,KAAA+B,aACA/B,KAAA4G,iBACA5G,KAAAuB,UAAAqE,EACA5F,KAAAkP,cAAAN,EACA5O,KAAAiC,OA4GA,QAAAkN,KACAnP,KAAAuC,cAAA,EACAvC,KAAAyC,gBAAA,EACAzC,KAAA0C,OAAA,KACA1C,KAAA6C,aAAA,KACA7C,KAAA8C,eAAA,KACA9C,KAAA+C,KAAA,KAkaA,QAAAgM,GAAAJ,EAAAC,GACA,GAAAC,GAAAF,CACA,iBAAAA,KACAE,EAAA7N,EAAAoL,oBAAAuC,GAGA,IAAAjI,GAAA1F,EAAAC,OAAA4N,EAAA,WACAC,EAAA9N,EAAAC,OAAA4N,EAAA,WAEA,IAAAnI,GAAA1G,KAAA4B,SACA,SAAAyC,OAAA,wBAAAqC,EAGA1G,MAAAoB,SAAA,GAAAC,GACArB,KAAAsB,OAAA,GAAAD,EAEA,IAAA+N,IACA9M,MAAA,EACAE,OAAA,EAEAxC,MAAAqP,UAAAP,EAAAxI,IAAA,SAAAiF,GACA,GAAAA,EAAArB,IAGA,SAAA7F,OAAA,qDAEA,IAAAiL,GAAAtO,EAAAC,OAAAsK,EAAA,UACAgE,EAAAvO,EAAAC,OAAAqO,EAAA,QACAE,EAAAxO,EAAAC,OAAAqO,EAAA,SAEA,IAAAC,EAAAH,EAAA9M,MACAiN,IAAAH,EAAA9M,MAAAkN,EAAAJ,EAAA5M,OACA,SAAA6B,OAAA,uDAIA,OAFA+K,GAAAE,GAGAG,iBAGAlN,cAAAgN,EAAA,EACA9M,gBAAA+M,EAAA,GAEAE,SAAA,GAAA9O,GAAAI,EAAAC,OAAAsK,EAAA,OAAAqD,MAh5BA,GAAA5N,GAAAd,EAAA,GACAyP,EAAAzP,EAAA,GACAmB,EAAAnB,EAAA,GAAAmB,SACAK,EAAAxB,EAAA,GACA0P,EAAA1P,EAAA,GAAA0P,SAaAhP,GAAAiB,cAAA,SAAA8M,EAAAC,GACA,MAAAI,GAAAnN,cAAA8M,EAAAC,IAMAhO,EAAAe,UAAAC,SAAA,EAgCAhB,EAAAe,UAAAkO,oBAAA,KACA/L,OAAAgM,eAAAlP,EAAAe,UAAA,sBACAoO,cAAA,EACAC,YAAA,EACAnC,IAAA,WAKA,MAJA7N,MAAA6P,qBACA7P,KAAAiQ,eAAAjQ,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAA6P,uBAIAjP,EAAAe,UAAAuO,mBAAA,KACApM,OAAAgM,eAAAlP,EAAAe,UAAA,qBACAoO,cAAA,EACAC,YAAA,EACAnC,IAAA,WAKA,MAJA7N,MAAAkQ,oBACAlQ,KAAAiQ,eAAAjQ,KAAAuB,UAAAvB,KAAA+B,YAGA/B,KAAAkQ,sBAIAtP,EAAAe,UAAAwO,wBACA,SAAAvI,EAAAqD,GACA,GAAAxK,GAAAmH,EAAAO,OAAA8C,EACA,aAAAxK,GAAmB,MAAAA,GAQnBG,EAAAe,UAAAsO,eACA,SAAArI,EAAAvB,GACA,SAAAhC,OAAA,6CAGAzD,EAAAwP,gBAAA,EACAxP,EAAAyP,eAAA,EAEAzP,EAAA0P,qBAAA,EACA1P,EAAA2P,kBAAA,EAkBA3P,EAAAe,UAAAO,YACA,SAAAqM,EAAAiC,EAAAC,GACA,GAGA7K,GAHA8K,EAAAF,GAAA,KACAG,EAAAF,GAAA7P,EAAAwP,eAGA,QAAAO,GACA,IAAA/P,GAAAwP,gBACAxK,EAAA5F,KAAA4Q,kBACA,MACA,KAAAhQ,GAAAyP,eACAzK,EAAA5F,KAAA6Q,iBACA,MACA,SACA,SAAAxM,OAAA,+BAGA,GAAAtC,GAAA/B,KAAA+B,UACA6D,GAAAU,IAAA,SAAAnE,GACA,GAAAO,GAAA,OAAAP,EAAAO,OAAA,KAAA1C,KAAAoB,SAAA0M,GAAA3L,EAAAO,OAEA,OADAA,GAAA1B,EAAAuL,iBAAAxK,EAAAW,EAAA1C,KAAAkP,gBAEAxM,SACAH,cAAAJ,EAAAI,cACAE,gBAAAN,EAAAM,gBACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,KAAA,OAAAZ,EAAAY,KAAA,KAAA/C,KAAAsB,OAAAwM,GAAA3L,EAAAY,QAEK/C,MAAAkD,QAAAqL,EAAAmC,IAyBL9P,EAAAe,UAAAmP,yBACA,SAAAhQ,GACA,GAAAwB,GAAAtB,EAAAC,OAAAH,EAAA,QAMAiQ,GACArO,OAAA1B,EAAAC,OAAAH,EAAA,UACA+B,aAAAP,EACAQ,eAAA9B,EAAAC,OAAAH,EAAA,YAIA,IADAiQ,EAAArO,OAAA1C,KAAAgR,iBAAAD,EAAArO,QACAqO,EAAArO,OAAA,EACA,QAGA,IAAAkD,MAEAqF,EAAAjL,KAAAiR,aAAAF,EACA/Q,KAAA6Q,kBACA,eACA,iBACA7P,EAAA0K,2BACAiE,EAAAY,kBACA,IAAAtF,GAAA,GACA,GAAA9I,GAAAnC,KAAA6Q,kBAAA5F,EAEA,IAAAiG,SAAApQ,EAAA0B,OAOA,IANA,GAAAK,GAAAV,EAAAU,aAMAV,KAAAU,kBACA+C,EAAAgI,MACAtL,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAA6Q,oBAAA5F,OASA,KANA,GAAAnI,GAAAX,EAAAW,eAMAX,GACAA,EAAAU,eAAAP,GACAH,EAAAW,mBACA8C,EAAAgI,MACAtL,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,8BAGAA,EAAAnC,KAAA6Q,oBAAA5F,GAKA,MAAArF,IAGAhG,EAAAgB,oBAgGAoO,EAAArN,UAAAmC,OAAAC,OAAAnD,EAAAe,WACAqN,EAAArN,UAAA+N,SAAA9O,EAMAoO,EAAArN,UAAAqP,iBAAA,SAAAnM,GACA,GAAAuM,GAAAvM,CAKA,IAJA,MAAA7E,KAAA+B,aACAqP,EAAApQ,EAAA2B,SAAA3C,KAAA+B,WAAAqP,IAGApR,KAAAoB,SAAAiC,IAAA+N,GACA,MAAApR,MAAAoB,SAAA8E,QAAAkL,EAKA,IAAAtL,EACA,KAAAA,EAAA,EAAaA,EAAA9F,KAAAiP,iBAAA/K,SAAkC4B,EAC/C,GAAA9F,KAAAiP,iBAAAnJ,IAAAjB,EACA,MAAAiB,EAIA,WAYAkJ,EAAAnN,cACA,SAAA8M,EAAAC,GACA,GAAAyC,GAAAvN,OAAAC,OAAAiL,EAAArN,WAEAgF,EAAA0K,EAAA/P,OAAAD,EAAA8L,UAAAwB,EAAArN,OAAAuE,WAAA,GACA5C,EAAAoO,EAAAjQ,SAAAC,EAAA8L,UAAAwB,EAAAvN,SAAAyE,WAAA,EACAwL,GAAAtP,WAAA4M,EAAAzN,YACAmQ,EAAAzK,eAAA+H,EAAAxI,wBAAAkL,EAAAjQ,SAAAyE,UACAwL,EAAAtP,YACAsP,EAAApP,KAAA0M,EAAA5N,MACAsQ,EAAAnC,cAAAN,EACAyC,EAAApC,iBAAAoC,EAAAjQ,SAAAyE,UAAAS,IAAA,SAAAiF,GACA,MAAAvK,GAAAuL,iBAAA8E,EAAAtP,WAAAwJ,EAAAqD,IAYA,QAJA0C,GAAA3C,EAAApN,UAAAsE,UAAAsF,QACAoG,EAAAF,EAAAxB,uBACA2B,EAAAH,EAAAnB,sBAEApK,EAAA,EAAA5B,EAAAoN,EAAApN,OAAsD4B,EAAA5B,EAAY4B,IAAA,CAClE,GAAA2L,GAAAH,EAAAxL,GACA4L,EAAA,GAAAvC,EACAuC,GAAAnP,cAAAkP,EAAAlP,cACAmP,EAAAjP,gBAAAgP,EAAAhP,gBAEAgP,EAAA/O,SACAgP,EAAAhP,OAAAO,EAAAiD,QAAAuL,EAAA/O,QACAgP,EAAA7O,aAAA4O,EAAA5O,aACA6O,EAAA5O,eAAA2O,EAAA3O,eAEA2O,EAAA1O,OACA2O,EAAA3O,KAAA4D,EAAAT,QAAAuL,EAAA1O,OAGAyO,EAAA5D,KAAA8D,IAGAH,EAAA3D,KAAA8D,GAKA,MAFA9B,GAAAyB,EAAAnB,mBAAAlP,EAAA0K,4BAEA2F,GAMArC,EAAArN,UAAAC,SAAA,EAKAkC,OAAAgM,eAAAd,EAAArN,UAAA,WACAkM,IAAA,WACA,MAAA7N,MAAAiP,iBAAA9D,WAqBA6D,EAAArN,UAAAsO,eACA,SAAArI,EAAAvB,GAeA,IAdA,GAYAlE,GAAAkK,EAAAsF,EAAAC,EAAAxJ,EAZA7F,EAAA,EACA8C,EAAA,EACAG,EAAA,EACAD,EAAA,EACAG,EAAA,EACAD,EAAA,EACAvB,EAAA0D,EAAA1D,OACA+G,EAAA,EACA4G,KACAC,KACAC,KACAT,KAGArG,EAAA/G,GACA,SAAA0D,EAAAO,OAAA8C,GACA1I,IACA0I,IACA5F,EAAA,MAEA,UAAAuC,EAAAO,OAAA8C,GACAA,QAEA,CASA,IARA9I,EAAA,GAAAgN,GACAhN,EAAAI,gBAOAqP,EAAA3G,EAAyB2G,EAAA1N,IACzBlE,KAAAmQ,wBAAAvI,EAAAgK,GADuCA,KAQvC,GAHAvF,EAAAzE,EAAAuD,MAAAF,EAAA2G,GAEAD,EAAAE,EAAAxF,GAEApB,GAAAoB,EAAAnI,WACS,CAET,IADAyN,KACA1G,EAAA2G,GACAlQ,EAAAiG,OAAAC,EAAAqD,EAAA6G,GACA1J,EAAA0J,EAAA1J,MACA6C,EAAA6G,EAAAzJ,KACAsJ,EAAA/D,KAAAxF,EAGA,QAAAuJ,EAAAzN,OACA,SAAAG,OAAA,yCAGA,QAAAsN,EAAAzN,OACA,SAAAG,OAAA,yCAGAwN,GAAAxF,GAAAsF,EAIAxP,EAAAM,gBAAA4C,EAAAsM,EAAA,GACAtM,EAAAlD,EAAAM,gBAEAkP,EAAAzN,OAAA,IAEA/B,EAAAO,OAAAgD,EAAAiM,EAAA,GACAjM,GAAAiM,EAAA,GAGAxP,EAAAU,aAAA2C,EAAAmM,EAAA,GACAnM,EAAArD,EAAAU,aAEAV,EAAAU,cAAA,EAGAV,EAAAW,eAAAyC,EAAAoM,EAAA,GACApM,EAAApD,EAAAW,eAEA6O,EAAAzN,OAAA,IAEA/B,EAAAY,KAAA0C,EAAAkM,EAAA,GACAlM,GAAAkM,EAAA,KAIAL,EAAA1D,KAAAzL,GACA,gBAAAA,GAAAU,cACAkP,EAAAnE,KAAAzL,GAKAyN,EAAA0B,EAAAtQ,EAAAgL,qCACAhM,KAAA6P,oBAAAyB,EAEA1B,EAAAmC,EAAA/Q,EAAA0K,4BACA1L,KAAAkQ,mBAAA6B,GAOA/C,EAAArN,UAAAsP,aACA,SAAAe,EAAAC,EAAAC,EACAC,EAAAC,EAAAC,GAMA,GAAAL,EAAAE,IAAA,EACA,SAAAzJ,WAAA,gDACAuJ,EAAAE,GAEA,IAAAF,EAAAG,GAAA,EACA,SAAA1J,WAAA,kDACAuJ,EAAAG,GAGA,OAAAxC,GAAA2C,OAAAN,EAAAC,EAAAG,EAAAC,IAOArD,EAAArN,UAAA4Q,mBACA,WACA,OAAAtH,GAAA,EAAuBA,EAAAjL,KAAA4Q,mBAAA1M,SAAwC+G,EAAA,CAC/D,GAAA9I,GAAAnC,KAAA4Q,mBAAA3F,EAMA,IAAAA,EAAA,EAAAjL,KAAA4Q,mBAAA1M,OAAA,CACA,GAAAsO,GAAAxS,KAAA4Q,mBAAA3F,EAAA,EAEA,IAAA9I,EAAAI,gBAAAiQ,EAAAjQ,cAAA,CACAJ,EAAAsQ,oBAAAD,EAAA/P,gBAAA,CACA,WAKAN,EAAAsQ,oBAAAC,MA4BA1D,EAAArN,UAAA8C,oBACA,SAAA3D,GACA,GAAAiQ,IACAxO,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAGAmK,EAAAjL,KAAAiR,aACAF,EACA/Q,KAAA4Q,mBACA,gBACA,kBACA5P,EAAAgL,oCACAhL,EAAAC,OAAAH,EAAA,OAAAF,EAAA0P,sBAGA,IAAArF,GAAA,GACA,GAAA9I,GAAAnC,KAAA4Q,mBAAA3F,EAEA,IAAA9I,EAAAI,gBAAAwO,EAAAxO,cAAA,CACA,GAAAG,GAAA1B,EAAAC,OAAAkB,EAAA,cACA,QAAAO,IACAA,EAAA1C,KAAAoB,SAAA0M,GAAApL,GACAA,EAAA1B,EAAAuL,iBAAAvM,KAAA+B,WAAAW,EAAA1C,KAAAkP,eAEA,IAAAnM,GAAA/B,EAAAC,OAAAkB,EAAA,YAIA,OAHA,QAAAY,IACAA,EAAA/C,KAAAsB,OAAAwM,GAAA/K,KAGAL,SACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,qBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,uBACAY,SAKA,OACAL,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAQAiM,EAAArN,UAAAgR,wBACA,WACA,QAAA3S,KAAA4G,iBAGA5G,KAAA4G,eAAA1C,QAAAlE,KAAAoB,SAAAmM,SACAvN,KAAA4G,eAAAgM,KAAA,SAAAC,GAA+C,aAAAA,MAQ/C7D,EAAArN,UAAA6B,iBACA,SAAAqB,EAAAiO,GACA,IAAA9S,KAAA4G,eACA,WAGA,IAAAqE,GAAAjL,KAAAgR,iBAAAnM,EACA,IAAAoG,GAAA,EACA,MAAAjL,MAAA4G,eAAAqE,EAGA,IAAAmG,GAAAvM,CACA,OAAA7E,KAAA+B,aACAqP,EAAApQ,EAAA2B,SAAA3C,KAAA+B,WAAAqP,GAGA,IAAAlH,EACA,UAAAlK,KAAA+B,aACAmI,EAAAlJ,EAAAuI,SAAAvJ,KAAA+B,aAAA,CAKA,GAAAgR,GAAA3B,EAAArG,QAAA,gBACA,YAAAb,EAAAP,QACA3J,KAAAoB,SAAAiC,IAAA0P,GACA,MAAA/S,MAAA4G,eAAA5G,KAAAoB,SAAA8E,QAAA6M,GAGA,MAAA7I,EAAAH,MAAA,KAAAG,EAAAH,OACA/J,KAAAoB,SAAAiC,IAAA,IAAA+N,GACA,MAAApR,MAAA4G,eAAA5G,KAAAoB,SAAA8E,QAAA,IAAAkL,IAQA,GAAA0B,EACA,WAGA,UAAAzO,OAAA,IAAA+M,EAAA,+BA2BApC,EAAArN,UAAAqR,qBACA,SAAAlS,GACA,GAAA4B,GAAA1B,EAAAC,OAAAH,EAAA,SAEA,IADA4B,EAAA1C,KAAAgR,iBAAAtO,GACAA,EAAA,EACA,OACAJ,KAAA,KACAE,OAAA,KACA2O,WAAA,KAIA,IAAAJ,IACArO,SACAG,aAAA7B,EAAAC,OAAAH,EAAA,QACAgC,eAAA9B,EAAAC,OAAAH,EAAA,WAGAmK,EAAAjL,KAAAiR,aACAF,EACA/Q,KAAA6Q,kBACA,eACA,iBACA7P,EAAA0K,2BACA1K,EAAAC,OAAAH,EAAA,OAAAF,EAAA0P,sBAGA,IAAArF,GAAA,GACA,GAAA9I,GAAAnC,KAAA6Q,kBAAA5F,EAEA,IAAA9I,EAAAO,SAAAqO,EAAArO,OACA,OACAJ,KAAAtB,EAAAC,OAAAkB,EAAA,sBACAK,OAAAxB,EAAAC,OAAAkB,EAAA,wBACAgP,WAAAnQ,EAAAC,OAAAkB,EAAA,6BAKA,OACAG,KAAA,KACAE,OAAA,KACA2O,WAAA,OAIAvR,EAAAoP,yBAmGAD,EAAApN,UAAAmC,OAAAC,OAAAnD,EAAAe,WACAoN,EAAApN,UAAAsR,YAAArS,EAKAmO,EAAApN,UAAAC,SAAA,EAKAkC,OAAAgM,eAAAf,EAAApN,UAAA,WACAkM,IAAA,WAEA,OADA5K,MACA6C,EAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAC9C,OAAAoN,GAAA,EAAqBA,EAAAlT,KAAAqP,UAAAvJ,GAAA4J,SAAAzM,QAAAiB,OAA+CgP,IACpEjQ,EAAA2K,KAAA5N,KAAAqP,UAAAvJ,GAAA4J,SAAAzM,QAAAiQ,GAGA,OAAAjQ,MAuBA8L,EAAApN,UAAA8C,oBACA,SAAA3D,GACA,GAAAiQ,IACAxO,cAAAvB,EAAAC,OAAAH,EAAA,QACA2B,gBAAAzB,EAAAC,OAAAH,EAAA,WAKAqS,EAAAxD,EAAA2C,OAAAvB,EAAA/Q,KAAAqP,UACA,SAAA0B,EAAAqC,GACA,GAAAtH,GAAAiF,EAAAxO,cAAA6Q,EAAA3D,gBAAAlN,aACA,OAAAuJ,GACAA,EAGAiF,EAAAtO,gBACA2Q,EAAA3D,gBAAAhN,kBAEA2Q,EAAApT,KAAAqP,UAAA8D,EAEA,OAAAC,GASAA,EAAA1D,SAAAjL,qBACAnC,KAAAyO,EAAAxO,eACA6Q,EAAA3D,gBAAAlN,cAAA,GACAC,OAAAuO,EAAAtO,iBACA2Q,EAAA3D,gBAAAlN,gBAAAwO,EAAAxO,cACA6Q,EAAA3D,gBAAAhN,gBAAA,EACA,GACA4Q,KAAAvS,EAAAuS,QAdA3Q,OAAA,KACAJ,KAAA,KACAE,OAAA,KACAO,KAAA,OAmBAgM,EAAApN,UAAAgR,wBACA,WACA,MAAA3S,MAAAqP,UAAAiE,MAAA,SAAA/H,GACA,MAAAA,GAAAmE,SAAAiD,6BASA5D,EAAApN,UAAA6B,iBACA,SAAAqB,EAAAiO,GACA,OAAAhN,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAAA,CAC9C,GAAAsN,GAAApT,KAAAqP,UAAAvJ,GAEAvC,EAAA6P,EAAA1D,SAAAlM,iBAAAqB,GAAA,EACA,IAAAtB,EACA,MAAAA,GAGA,GAAAuP,EACA,WAGA,UAAAzO,OAAA,IAAAQ,EAAA,+BAsBAkK,EAAApN,UAAAqR,qBACA,SAAAlS,GACA,OAAAgF,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAAA,CAC9C,GAAAsN,GAAApT,KAAAqP,UAAAvJ,EAIA,IAAAsN,EAAA1D,SAAAsB,iBAAAhQ,EAAAC,OAAAH,EAAA,iBAGA,GAAAyS,GAAAH,EAAA1D,SAAAsD,qBAAAlS,EACA,IAAAyS,EAAA,CACA,GAAAC,IACAlR,KAAAiR,EAAAjR,MACA8Q,EAAA3D,gBAAAlN,cAAA,GACAC,OAAA+Q,EAAA/Q,QACA4Q,EAAA3D,gBAAAlN,gBAAAgR,EAAAjR,KACA8Q,EAAA3D,gBAAAhN,gBAAA,EACA,GAEA,OAAA+Q,KAIA,OACAlR,KAAA,KACAE,OAAA,OASAuM,EAAApN,UAAAsO,eACA,SAAArI,EAAAvB,GACArG,KAAA6P,uBACA7P,KAAAkQ,qBACA,QAAApK,GAAA,EAAmBA,EAAA9F,KAAAqP,UAAAnL,OAA2B4B,IAG9C,OAFAsN,GAAApT,KAAAqP,UAAAvJ,GACA2N,EAAAL,EAAA1D,SAAAkB,mBACAsC,EAAA,EAAqBA,EAAAO,EAAAvP,OAA4BgP,IAAA,CACjD,GAAA/Q,GAAAsR,EAAAP,GAEAxQ,EAAA0Q,EAAA1D,SAAAtO,SAAA0M,GAAA3L,EAAAO,OACAA,GAAA1B,EAAAuL,iBAAA6G,EAAA1D,SAAA3N,WAAAW,EAAA1C,KAAAkP,eACAlP,KAAAoB,SAAAkC,IAAAZ,GACAA,EAAA1C,KAAAoB,SAAA8E,QAAAxD,EAEA,IAAAK,GAAA,IACAZ,GAAAY,OACAA,EAAAqQ,EAAA1D,SAAApO,OAAAwM,GAAA3L,EAAAY,MACA/C,KAAAsB,OAAAgC,IAAAP,GACAA,EAAA/C,KAAAsB,OAAA4E,QAAAnD,GAOA,IAAA2Q,IACAhR,SACAH,cAAAJ,EAAAI,eACA6Q,EAAA3D,gBAAAlN,cAAA,GACAE,gBAAAN,EAAAM,iBACA2Q,EAAA3D,gBAAAlN,gBAAAJ,EAAAI,cACA6Q,EAAA3D,gBAAAhN,gBAAA,EACA,GACAI,aAAAV,EAAAU,aACAC,eAAAX,EAAAW,eACAC,OAGA/C,MAAA6P,oBAAAjC,KAAA8F,GACA,gBAAAA,GAAA7Q,cACA7C,KAAAkQ,mBAAAtC,KAAA8F,GAKA9D,EAAA5P,KAAA6P,oBAAA7O,EAAAgL,qCACA4D,EAAA5P,KAAAkQ,mBAAAlP,EAAA0K,6BAGA9L,EAAAmP,4BTu5CM,SAAUlP,EAAQD,GUx/ExB,QAAA+T,GAAAC,EAAAC,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAUA,GAAA2B,GAAAC,KAAAC,OAAAL,EAAAD,GAAA,GAAAA,EACA9H,EAAAiI,EAAA/B,EAAA8B,EAAAE,IAAA,EACA,YAAAlI,EAEAkI,EAEAlI,EAAA,EAEA+H,EAAAG,EAAA,EAEAL,EAAAK,EAAAH,EAAA7B,EAAA8B,EAAAC,EAAA1B,GAKAA,GAAAzS,EAAA2Q,kBACAsD,EAAAC,EAAA5P,OAAA2P,GAAA,EAEAG,EAKAA,EAAAJ,EAAA,EAEAD,EAAAC,EAAAI,EAAAhC,EAAA8B,EAAAC,EAAA1B,GAIAA,GAAAzS,EAAA2Q,kBACAyD,EAEAJ,EAAA,KAAAA,EA1DAhU,EAAA0Q,qBAAA,EACA1Q,EAAA2Q,kBAAA,EAgFA3Q,EAAA0S,OAAA,SAAAN,EAAA8B,EAAAC,EAAA1B,GACA,OAAAyB,EAAA5P,OACA,QAGA,IAAA+G,GAAA0I,GAAA,EAAAG,EAAA5P,OAAA8N,EAAA8B,EACAC,EAAA1B,GAAAzS,EAAA0Q,qBACA,IAAArF,EAAA,EACA,QAMA,MAAAA,EAAA,MACA,IAAA8I,EAAAD,EAAA7I,GAAA6I,EAAA7I,EAAA,UAGAA,CAGA,OAAAA,KVuhFM,SAAUpL,EAAQD,GWzmFxB,QAAAuU,GAAAC,EAAAC,EAAAC,GACA,GAAAxC,GAAAsC,EAAAC,EACAD,GAAAC,GAAAD,EAAAE,GACAF,EAAAE,GAAAxC,EAWA,QAAAyC,GAAAC,EAAAC,GACA,MAAAR,MAAAS,MAAAF,EAAAP,KAAAU,UAAAF,EAAAD,IAeA,QAAAI,GAAAR,EAAAS,EAAAnU,EAAAoU,GAKA,GAAApU,EAAAoU,EAAA,CAYA,GAAAC,GAAAR,EAAA7T,EAAAoU,GACAhP,EAAApF,EAAA,CAEAyT,GAAAC,EAAAW,EAAAD,EASA,QARAE,GAAAZ,EAAAU,GAQA5B,EAAAxS,EAAmBwS,EAAA4B,EAAO5B,IAC1B2B,EAAAT,EAAAlB,GAAA8B,IAAA,IACAlP,GAAA,EACAqO,EAAAC,EAAAtO,EAAAoN,GAIAiB,GAAAC,EAAAtO,EAAA,EAAAoN,EACA,IAAA+B,GAAAnP,EAAA,CAIA8O,GAAAR,EAAAS,EAAAnU,EAAAuU,EAAA,GACAL,EAAAR,EAAAS,EAAAI,EAAA,EAAAH,IAYAlV,EAAAgQ,UAAA,SAAAwE,EAAAS,GACAD,EAAAR,EAAAS,EAAA,EAAAT,EAAAlQ,OAAA,KX4oFM,SAAUrE,EAAQD,EAASM,GY1tFjC,QAAAW,GAAAqU,EAAAC,EAAAtQ,EAAAuQ,EAAAtQ,GACA9E,KAAAqV,YACArV,KAAAsV,kBACAtV,KAAAsC,KAAA,MAAA4S,EAAA,KAAAA,EACAlV,KAAAwC,OAAA,MAAA2S,EAAA,KAAAA,EACAnV,KAAA0C,OAAA,MAAAmC,EAAA,KAAAA,EACA7E,KAAA+C,KAAA,MAAA+B,EAAA,KAAAA,EACA9E,KAAAuV,IAAA,EACA,MAAAH,GAAApV,KAAAsD,IAAA8R,GAnCA,GAAAzU,GAAAT,EAAA,GAAAS,mBACAK,EAAAd,EAAA,GAIAsV,EAAA,UAGAC,EAAA,GAKAF,EAAA,oBAiCA1U,GAAA6U,wBACA,SAAAC,EAAA7T,EAAA8T,GA+FA,QAAAC,GAAA1T,EAAA2T,GACA,UAAA3T,GAAA+O,SAAA/O,EAAAO,OACAqT,EAAAzS,IAAAwS,OACO,CACP,GAAApT,GAAAkT,EACA5U,EAAA0D,KAAAkR,EAAAzT,EAAAO,QACAP,EAAAO,MACAqT,GAAAzS,IAAA,GAAAzC,GAAAsB,EAAAU,aACAV,EAAAW,eACAJ,EACAoT,EACA3T,EAAAY,QAvGA,GAAAgT,GAAA,GAAAlV,GAMAmV,EAAAL,EAAApN,MAAAiN,GACAS,EAAA,EACAC,EAAA,WAMA,QAAAC,KACA,MAAAF,GAAAD,EAAA9R,OACA8R,EAAAC,KAAA/E,OAPA,GAAAkF,GAAAD,IAEAE,EAAAF,KAAA,EACA,OAAAC,GAAAC,GASAC,EAAA,EAAA7D,EAAA,EAKA8D,EAAA,IAgEA,OA9DAzU,GAAAI,YAAA,SAAAC,GACA,UAAAoU,EAAA,CAGA,KAAAD,EAAAnU,EAAAI,eAMS,CAIT,GAAAiU,GAAAR,EAAAC,IAAA,GACAH,EAAAU,EAAAnL,OAAA,EAAAlJ,EAAAM,gBACAgQ,EAOA,OANAuD,GAAAC,GAAAO,EAAAnL,OAAAlJ,EAAAM,gBACAgQ,GACAA,EAAAtQ,EAAAM,gBACAoT,EAAAU,EAAAT,QAEAS,EAAApU,GAhBA0T,EAAAU,EAAAL,KACAI,IACA7D,EAAA,EAqBA,KAAA6D,EAAAnU,EAAAI,eACAwT,EAAAzS,IAAA4S,KACAI,GAEA,IAAA7D,EAAAtQ,EAAAM,gBAAA,CACA,GAAA+T,GAAAR,EAAAC,IAAA,EACAF,GAAAzS,IAAAkT,EAAAnL,OAAA,EAAAlJ,EAAAM,kBACAuT,EAAAC,GAAAO,EAAAnL,OAAAlJ,EAAAM,iBACAgQ,EAAAtQ,EAAAM,gBAEA8T,EAAApU,GACKnC,MAELiW,EAAAD,EAAA9R,SACAqS,GAEAV,EAAAU,EAAAL,KAGAH,EAAAzS,IAAA0S,EAAAvL,OAAAwL,GAAAvR,KAAA,MAIA5C,EAAAmB,QAAAC,QAAA,SAAAC,GACA,GAAAI,GAAAzB,EAAA0B,iBAAAL,EACA,OAAAI,IACA,MAAAqS,IACAzS,EAAAnC,EAAA0D,KAAAkR,EAAAzS,IAEA4S,EAAAtS,iBAAAN,EAAAI,MAIAwS,GAwBAlV,EAAAc,UAAA2B,IAAA,SAAAmT,GACA,GAAArL,MAAAsL,QAAAD,GACAA,EAAAvT,QAAA,SAAAyT,GACA3W,KAAAsD,IAAAqT,IACK3W,UAEL,KAAAyW,EAAAlB,IAAA,gBAAAkB,GAMA,SAAAhO,WACA,8EAAAgO,EANAA,IACAzW,KAAAqV,SAAAzH,KAAA6I,GAQA,MAAAzW,OASAa,EAAAc,UAAAiV,QAAA,SAAAH,GACA,GAAArL,MAAAsL,QAAAD,GACA,OAAA3Q,GAAA2Q,EAAAvS,OAAA,EAAiC4B,GAAA,EAAQA,IACzC9F,KAAA4W,QAAAH,EAAA3Q,QAGA,KAAA2Q,EAAAlB,IAAA,gBAAAkB,GAIA,SAAAhO,WACA,8EAAAgO,EAJAzW,MAAAqV,SAAAwB,QAAAJ,GAOA,MAAAzW,OAUAa,EAAAc,UAAAmV,KAAA,SAAAC,GAEA,OADAJ,GACA7Q,EAAA,EAAAC,EAAA/F,KAAAqV,SAAAnR,OAA6C4B,EAAAC,EAASD,IACtD6Q,EAAA3W,KAAAqV,SAAAvP,GACA6Q,EAAApB,GACAoB,EAAAG,KAAAC,GAGA,KAAAJ,GACAI,EAAAJ,GAAoBjU,OAAA1C,KAAA0C,OACpBJ,KAAAtC,KAAAsC,KACAE,OAAAxC,KAAAwC,OACAO,KAAA/C,KAAA+C,QAYAlC,EAAAc,UAAA+C,KAAA,SAAAsS,GACA,GAAAC,GACAnR,EACAC,EAAA/F,KAAAqV,SAAAnR,MACA,IAAA6B,EAAA,GAEA,IADAkR,KACAnR,EAAA,EAAeA,EAAAC,EAAA,EAAWD,IAC1BmR,EAAArJ,KAAA5N,KAAAqV,SAAAvP,IACAmR,EAAArJ,KAAAoJ,EAEAC,GAAArJ,KAAA5N,KAAAqV,SAAAvP,IACA9F,KAAAqV,SAAA4B,EAEA,MAAAjX,OAUAa,EAAAc,UAAAuV,aAAA,SAAAC,EAAAC,GACA,GAAAC,GAAArX,KAAAqV,SAAArV,KAAAqV,SAAAnR,OAAA,EAUA,OATAmT,GAAA9B,GACA8B,EAAAH,aAAAC,EAAAC,GAEA,gBAAAC,GACArX,KAAAqV,SAAArV,KAAAqV,SAAAnR,OAAA,GAAAmT,EAAAtM,QAAAoM,EAAAC,GAGApX,KAAAqV,SAAAzH,KAAA,GAAA7C,QAAAoM,EAAAC,IAEApX,MAUAa,EAAAc,UAAA8B,iBACA,SAAAG,EAAAC,GACA7D,KAAAsV,eAAAtU,EAAAgD,YAAAJ,IAAAC,GASAhD,EAAAc,UAAA2V,mBACA,SAAAP,GACA,OAAAjR,GAAA,EAAAC,EAAA/F,KAAAqV,SAAAnR,OAA+C4B,EAAAC,EAASD,IACxD9F,KAAAqV,SAAAvP,GAAAyP,IACAvV,KAAAqV,SAAAvP,GAAAwR,mBAAAP,EAKA,QADA9T,GAAAa,OAAAG,KAAAjE,KAAAsV,gBACAxP,EAAA,EAAAC,EAAA9C,EAAAiB,OAAyC4B,EAAAC,EAASD,IAClDiR,EAAA/V,EAAAyK,cAAAxI,EAAA6C,IAAA9F,KAAAsV,eAAArS,EAAA6C,MAQAjF,EAAAc,UAAAkF,SAAA,WACA,GAAAwF,GAAA,EAIA,OAHArM,MAAA8W,KAAA,SAAAH,GACAtK,GAAAsK,IAEAtK,GAOAxL,EAAAc,UAAA4V,sBAAA,SAAAzW,GACA,GAAAuB,IACAyT,KAAA,GACAxT,KAAA,EACAE,OAAA,GAEA8D,EAAA,GAAA3F,GAAAG,GACA0W,GAAA,EACAC,EAAA,KACAC,EAAA,KACAC,EAAA,KACAC,EAAA,IAqEA,OApEA5X,MAAA8W,KAAA,SAAAH,EAAA/T,GACAP,EAAAyT,MAAAa,EACA,OAAA/T,EAAAF,QACA,OAAAE,EAAAN,MACA,OAAAM,EAAAJ,QACAiV,IAAA7U,EAAAF,QACAgV,IAAA9U,EAAAN,MACAqV,IAAA/U,EAAAJ,QACAoV,IAAAhV,EAAAG,MACAuD,EAAAtD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,OAGA0U,EAAA7U,EAAAF,OACAgV,EAAA9U,EAAAN,KACAqV,EAAA/U,EAAAJ,OACAoV,EAAAhV,EAAAG,KACAyU,GAAA,GACKA,IACLlR,EAAAtD,YACAX,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,UAGAiV,EAAA,KACAD,GAAA,EAEA,QAAA7J,GAAA,EAAAzJ,EAAAyS,EAAAzS,OAA4CyJ,EAAAzJ,EAAcyJ,IAC1DgJ,EAAAzO,WAAAyF,KAAA8H,GACApT,EAAAC,OACAD,EAAAG,OAAA,EAEAmL,EAAA,IAAAzJ,GACAuT,EAAA,KACAD,GAAA,GACSA,GACTlR,EAAAtD,YACAN,OAAAE,EAAAF,OACAE,UACAN,KAAAM,EAAAN,KACAE,OAAAI,EAAAJ,QAEAH,WACAC,KAAAD,EAAAC,KACAE,OAAAH,EAAAG,QAEAO,KAAAH,EAAAG,QAIAV,EAAAG,WAIAxC,KAAAsX,mBAAA,SAAAnU,EAAA0U,GACAvR,EAAA7C,iBAAAN,EAAA0U,MAGU/B,KAAAzT,EAAAyT,KAAAxP,QAGV1G,EAAAiB","file":"source-map.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sourceMap\"] = factory();\n\telse\n\t\troot[\"sourceMap\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/*\n\t * Copyright 2009-2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE.txt or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\texports.SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\texports.SourceMapConsumer = __webpack_require__(7).SourceMapConsumer;\n\texports.SourceNode = __webpack_require__(10).SourceNode;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar base64VLQ = __webpack_require__(2);\n\tvar util = __webpack_require__(4);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar MappingList = __webpack_require__(6).MappingList;\n\t\n\t/**\n\t * An instance of the SourceMapGenerator represents a source map which is\n\t * being built incrementally. You may pass an object with the following\n\t * properties:\n\t *\n\t * - file: The filename of the generated source.\n\t * - sourceRoot: A root for all relative URLs in this source map.\n\t */\n\tfunction SourceMapGenerator(aArgs) {\n\t if (!aArgs) {\n\t aArgs = {};\n\t }\n\t this._file = util.getArg(aArgs, 'file', null);\n\t this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n\t this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t this._mappings = new MappingList();\n\t this._sourcesContents = null;\n\t}\n\t\n\tSourceMapGenerator.prototype._version = 3;\n\t\n\t/**\n\t * Creates a new SourceMapGenerator based on a SourceMapConsumer\n\t *\n\t * @param aSourceMapConsumer The SourceMap.\n\t */\n\tSourceMapGenerator.fromSourceMap =\n\t function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n\t var sourceRoot = aSourceMapConsumer.sourceRoot;\n\t var generator = new SourceMapGenerator({\n\t file: aSourceMapConsumer.file,\n\t sourceRoot: sourceRoot\n\t });\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t var newMapping = {\n\t generated: {\n\t line: mapping.generatedLine,\n\t column: mapping.generatedColumn\n\t }\n\t };\n\t\n\t if (mapping.source != null) {\n\t newMapping.source = mapping.source;\n\t if (sourceRoot != null) {\n\t newMapping.source = util.relative(sourceRoot, newMapping.source);\n\t }\n\t\n\t newMapping.original = {\n\t line: mapping.originalLine,\n\t column: mapping.originalColumn\n\t };\n\t\n\t if (mapping.name != null) {\n\t newMapping.name = mapping.name;\n\t }\n\t }\n\t\n\t generator.addMapping(newMapping);\n\t });\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var sourceRelative = sourceFile;\n\t if (sourceRoot !== null) {\n\t sourceRelative = util.relative(sourceRoot, sourceFile);\n\t }\n\t\n\t if (!generator._sources.has(sourceRelative)) {\n\t generator._sources.add(sourceRelative);\n\t }\n\t\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t generator.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t return generator;\n\t };\n\t\n\t/**\n\t * Add a single mapping from original source line and column to the generated\n\t * source's line and column for this source map being created. The mapping\n\t * object should have the following properties:\n\t *\n\t * - generated: An object with the generated line and column positions.\n\t * - original: An object with the original line and column positions.\n\t * - source: The original source file (relative to the sourceRoot).\n\t * - name: An optional original token name for this mapping.\n\t */\n\tSourceMapGenerator.prototype.addMapping =\n\t function SourceMapGenerator_addMapping(aArgs) {\n\t var generated = util.getArg(aArgs, 'generated');\n\t var original = util.getArg(aArgs, 'original', null);\n\t var source = util.getArg(aArgs, 'source', null);\n\t var name = util.getArg(aArgs, 'name', null);\n\t\n\t if (!this._skipValidation) {\n\t this._validateMapping(generated, original, source, name);\n\t }\n\t\n\t if (source != null) {\n\t source = String(source);\n\t if (!this._sources.has(source)) {\n\t this._sources.add(source);\n\t }\n\t }\n\t\n\t if (name != null) {\n\t name = String(name);\n\t if (!this._names.has(name)) {\n\t this._names.add(name);\n\t }\n\t }\n\t\n\t this._mappings.add({\n\t generatedLine: generated.line,\n\t generatedColumn: generated.column,\n\t originalLine: original != null && original.line,\n\t originalColumn: original != null && original.column,\n\t source: source,\n\t name: name\n\t });\n\t };\n\t\n\t/**\n\t * Set the source content for a source file.\n\t */\n\tSourceMapGenerator.prototype.setSourceContent =\n\t function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n\t var source = aSourceFile;\n\t if (this._sourceRoot != null) {\n\t source = util.relative(this._sourceRoot, source);\n\t }\n\t\n\t if (aSourceContent != null) {\n\t // Add the source content to the _sourcesContents map.\n\t // Create a new _sourcesContents map if the property is null.\n\t if (!this._sourcesContents) {\n\t this._sourcesContents = Object.create(null);\n\t }\n\t this._sourcesContents[util.toSetString(source)] = aSourceContent;\n\t } else if (this._sourcesContents) {\n\t // Remove the source file from the _sourcesContents map.\n\t // If the _sourcesContents map is empty, set the property to null.\n\t delete this._sourcesContents[util.toSetString(source)];\n\t if (Object.keys(this._sourcesContents).length === 0) {\n\t this._sourcesContents = null;\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Applies the mappings of a sub-source-map for a specific source file to the\n\t * source map being generated. Each mapping to the supplied source file is\n\t * rewritten using the supplied source map. Note: The resolution for the\n\t * resulting mappings is the minimium of this map and the supplied map.\n\t *\n\t * @param aSourceMapConsumer The source map to be applied.\n\t * @param aSourceFile Optional. The filename of the source file.\n\t * If omitted, SourceMapConsumer's file property will be used.\n\t * @param aSourceMapPath Optional. The dirname of the path to the source map\n\t * to be applied. If relative, it is relative to the SourceMapConsumer.\n\t * This parameter is needed when the two source maps aren't in the same\n\t * directory, and the source map to be applied contains relative source\n\t * paths. If so, those relative source paths need to be rewritten\n\t * relative to the SourceMapGenerator.\n\t */\n\tSourceMapGenerator.prototype.applySourceMap =\n\t function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n\t var sourceFile = aSourceFile;\n\t // If aSourceFile is omitted, we will use the file property of the SourceMap\n\t if (aSourceFile == null) {\n\t if (aSourceMapConsumer.file == null) {\n\t throw new Error(\n\t 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n\t 'or the source map\\'s \"file\" property. Both were omitted.'\n\t );\n\t }\n\t sourceFile = aSourceMapConsumer.file;\n\t }\n\t var sourceRoot = this._sourceRoot;\n\t // Make \"sourceFile\" relative if an absolute Url is passed.\n\t if (sourceRoot != null) {\n\t sourceFile = util.relative(sourceRoot, sourceFile);\n\t }\n\t // Applying the SourceMap can add and remove items from the sources and\n\t // the names array.\n\t var newSources = new ArraySet();\n\t var newNames = new ArraySet();\n\t\n\t // Find mappings for the \"sourceFile\"\n\t this._mappings.unsortedForEach(function (mapping) {\n\t if (mapping.source === sourceFile && mapping.originalLine != null) {\n\t // Check if it can be mapped by the source map, then update the mapping.\n\t var original = aSourceMapConsumer.originalPositionFor({\n\t line: mapping.originalLine,\n\t column: mapping.originalColumn\n\t });\n\t if (original.source != null) {\n\t // Copy mapping\n\t mapping.source = original.source;\n\t if (aSourceMapPath != null) {\n\t mapping.source = util.join(aSourceMapPath, mapping.source)\n\t }\n\t if (sourceRoot != null) {\n\t mapping.source = util.relative(sourceRoot, mapping.source);\n\t }\n\t mapping.originalLine = original.line;\n\t mapping.originalColumn = original.column;\n\t if (original.name != null) {\n\t mapping.name = original.name;\n\t }\n\t }\n\t }\n\t\n\t var source = mapping.source;\n\t if (source != null && !newSources.has(source)) {\n\t newSources.add(source);\n\t }\n\t\n\t var name = mapping.name;\n\t if (name != null && !newNames.has(name)) {\n\t newNames.add(name);\n\t }\n\t\n\t }, this);\n\t this._sources = newSources;\n\t this._names = newNames;\n\t\n\t // Copy sourcesContents of applied map.\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aSourceMapPath != null) {\n\t sourceFile = util.join(aSourceMapPath, sourceFile);\n\t }\n\t if (sourceRoot != null) {\n\t sourceFile = util.relative(sourceRoot, sourceFile);\n\t }\n\t this.setSourceContent(sourceFile, content);\n\t }\n\t }, this);\n\t };\n\t\n\t/**\n\t * A mapping can have one of the three levels of data:\n\t *\n\t * 1. Just the generated position.\n\t * 2. The Generated position, original position, and original source.\n\t * 3. Generated and original position, original source, as well as a name\n\t * token.\n\t *\n\t * To maintain consistency, we validate that any new mapping being added falls\n\t * in to one of these categories.\n\t */\n\tSourceMapGenerator.prototype._validateMapping =\n\t function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n\t aName) {\n\t // When aOriginal is truthy but has empty values for .line and .column,\n\t // it is most likely a programmer error. In this case we throw a very\n\t // specific error message to try to guide them the right way.\n\t // For example: https://github.com/Polymer/polymer-bundler/pull/519\n\t if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n\t throw new Error(\n\t 'original.line and original.column are not numbers -- you probably meant to omit ' +\n\t 'the original mapping entirely and only map the generated position. If so, pass ' +\n\t 'null for the original mapping instead of an object with empty or null values.'\n\t );\n\t }\n\t\n\t if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && !aOriginal && !aSource && !aName) {\n\t // Case 1.\n\t return;\n\t }\n\t else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n\t && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n\t && aGenerated.line > 0 && aGenerated.column >= 0\n\t && aOriginal.line > 0 && aOriginal.column >= 0\n\t && aSource) {\n\t // Cases 2 and 3.\n\t return;\n\t }\n\t else {\n\t throw new Error('Invalid mapping: ' + JSON.stringify({\n\t generated: aGenerated,\n\t source: aSource,\n\t original: aOriginal,\n\t name: aName\n\t }));\n\t }\n\t };\n\t\n\t/**\n\t * Serialize the accumulated mappings in to the stream of base 64 VLQs\n\t * specified by the source map format.\n\t */\n\tSourceMapGenerator.prototype._serializeMappings =\n\t function SourceMapGenerator_serializeMappings() {\n\t var previousGeneratedColumn = 0;\n\t var previousGeneratedLine = 1;\n\t var previousOriginalColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousName = 0;\n\t var previousSource = 0;\n\t var result = '';\n\t var next;\n\t var mapping;\n\t var nameIdx;\n\t var sourceIdx;\n\t\n\t var mappings = this._mappings.toArray();\n\t for (var i = 0, len = mappings.length; i < len; i++) {\n\t mapping = mappings[i];\n\t next = ''\n\t\n\t if (mapping.generatedLine !== previousGeneratedLine) {\n\t previousGeneratedColumn = 0;\n\t while (mapping.generatedLine !== previousGeneratedLine) {\n\t next += ';';\n\t previousGeneratedLine++;\n\t }\n\t }\n\t else {\n\t if (i > 0) {\n\t if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n\t continue;\n\t }\n\t next += ',';\n\t }\n\t }\n\t\n\t next += base64VLQ.encode(mapping.generatedColumn\n\t - previousGeneratedColumn);\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (mapping.source != null) {\n\t sourceIdx = this._sources.indexOf(mapping.source);\n\t next += base64VLQ.encode(sourceIdx - previousSource);\n\t previousSource = sourceIdx;\n\t\n\t // lines are stored 0-based in SourceMap spec version 3\n\t next += base64VLQ.encode(mapping.originalLine - 1\n\t - previousOriginalLine);\n\t previousOriginalLine = mapping.originalLine - 1;\n\t\n\t next += base64VLQ.encode(mapping.originalColumn\n\t - previousOriginalColumn);\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (mapping.name != null) {\n\t nameIdx = this._names.indexOf(mapping.name);\n\t next += base64VLQ.encode(nameIdx - previousName);\n\t previousName = nameIdx;\n\t }\n\t }\n\t\n\t result += next;\n\t }\n\t\n\t return result;\n\t };\n\t\n\tSourceMapGenerator.prototype._generateSourcesContent =\n\t function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n\t return aSources.map(function (source) {\n\t if (!this._sourcesContents) {\n\t return null;\n\t }\n\t if (aSourceRoot != null) {\n\t source = util.relative(aSourceRoot, source);\n\t }\n\t var key = util.toSetString(source);\n\t return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n\t ? this._sourcesContents[key]\n\t : null;\n\t }, this);\n\t };\n\t\n\t/**\n\t * Externalize the source map.\n\t */\n\tSourceMapGenerator.prototype.toJSON =\n\t function SourceMapGenerator_toJSON() {\n\t var map = {\n\t version: this._version,\n\t sources: this._sources.toArray(),\n\t names: this._names.toArray(),\n\t mappings: this._serializeMappings()\n\t };\n\t if (this._file != null) {\n\t map.file = this._file;\n\t }\n\t if (this._sourceRoot != null) {\n\t map.sourceRoot = this._sourceRoot;\n\t }\n\t if (this._sourcesContents) {\n\t map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n\t }\n\t\n\t return map;\n\t };\n\t\n\t/**\n\t * Render the source map being generated to a string.\n\t */\n\tSourceMapGenerator.prototype.toString =\n\t function SourceMapGenerator_toString() {\n\t return JSON.stringify(this.toJSON());\n\t };\n\t\n\texports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t *\n\t * Based on the Base 64 VLQ implementation in Closure Compiler:\n\t * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n\t *\n\t * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are\n\t * met:\n\t *\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above\n\t * copyright notice, this list of conditions and the following\n\t * disclaimer in the documentation and/or other materials provided\n\t * with the distribution.\n\t * * Neither the name of Google Inc. nor the names of its\n\t * contributors may be used to endorse or promote products derived\n\t * from this software without specific prior written permission.\n\t *\n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t */\n\t\n\tvar base64 = __webpack_require__(3);\n\t\n\t// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n\t// length quantities we use in the source map spec, the first bit is the sign,\n\t// the next four bits are the actual value, and the 6th bit is the\n\t// continuation bit. The continuation bit tells us whether there are more\n\t// digits in this value following this digit.\n\t//\n\t// Continuation\n\t// | Sign\n\t// | |\n\t// V V\n\t// 101011\n\t\n\tvar VLQ_BASE_SHIFT = 5;\n\t\n\t// binary: 100000\n\tvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\t\n\t// binary: 011111\n\tvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\t\n\t// binary: 100000\n\tvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\t\n\t/**\n\t * Converts from a two-complement value to a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n\t * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n\t */\n\tfunction toVLQSigned(aValue) {\n\t return aValue < 0\n\t ? ((-aValue) << 1) + 1\n\t : (aValue << 1) + 0;\n\t}\n\t\n\t/**\n\t * Converts to a two-complement value from a value where the sign bit is\n\t * placed in the least significant bit. For example, as decimals:\n\t * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n\t * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n\t */\n\tfunction fromVLQSigned(aValue) {\n\t var isNegative = (aValue & 1) === 1;\n\t var shifted = aValue >> 1;\n\t return isNegative\n\t ? -shifted\n\t : shifted;\n\t}\n\t\n\t/**\n\t * Returns the base 64 VLQ encoded value.\n\t */\n\texports.encode = function base64VLQ_encode(aValue) {\n\t var encoded = \"\";\n\t var digit;\n\t\n\t var vlq = toVLQSigned(aValue);\n\t\n\t do {\n\t digit = vlq & VLQ_BASE_MASK;\n\t vlq >>>= VLQ_BASE_SHIFT;\n\t if (vlq > 0) {\n\t // There are still more digits in this value, so we must make sure the\n\t // continuation bit is marked.\n\t digit |= VLQ_CONTINUATION_BIT;\n\t }\n\t encoded += base64.encode(digit);\n\t } while (vlq > 0);\n\t\n\t return encoded;\n\t};\n\t\n\t/**\n\t * Decodes the next base 64 VLQ value from the given string and returns the\n\t * value and the rest of the string via the out parameter.\n\t */\n\texports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n\t var strLen = aStr.length;\n\t var result = 0;\n\t var shift = 0;\n\t var continuation, digit;\n\t\n\t do {\n\t if (aIndex >= strLen) {\n\t throw new Error(\"Expected more digits in base 64 VLQ value.\");\n\t }\n\t\n\t digit = base64.decode(aStr.charCodeAt(aIndex++));\n\t if (digit === -1) {\n\t throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n\t }\n\t\n\t continuation = !!(digit & VLQ_CONTINUATION_BIT);\n\t digit &= VLQ_BASE_MASK;\n\t result = result + (digit << shift);\n\t shift += VLQ_BASE_SHIFT;\n\t } while (continuation);\n\t\n\t aOutParam.value = fromVLQSigned(result);\n\t aOutParam.rest = aIndex;\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\t\n\t/**\n\t * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n\t */\n\texports.encode = function (number) {\n\t if (0 <= number && number < intToCharMap.length) {\n\t return intToCharMap[number];\n\t }\n\t throw new TypeError(\"Must be between 0 and 63: \" + number);\n\t};\n\t\n\t/**\n\t * Decode a single base 64 character code digit to an integer. Returns -1 on\n\t * failure.\n\t */\n\texports.decode = function (charCode) {\n\t var bigA = 65; // 'A'\n\t var bigZ = 90; // 'Z'\n\t\n\t var littleA = 97; // 'a'\n\t var littleZ = 122; // 'z'\n\t\n\t var zero = 48; // '0'\n\t var nine = 57; // '9'\n\t\n\t var plus = 43; // '+'\n\t var slash = 47; // '/'\n\t\n\t var littleOffset = 26;\n\t var numberOffset = 52;\n\t\n\t // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\t if (bigA <= charCode && charCode <= bigZ) {\n\t return (charCode - bigA);\n\t }\n\t\n\t // 26 - 51: abcdefghijklmnopqrstuvwxyz\n\t if (littleA <= charCode && charCode <= littleZ) {\n\t return (charCode - littleA + littleOffset);\n\t }\n\t\n\t // 52 - 61: 0123456789\n\t if (zero <= charCode && charCode <= nine) {\n\t return (charCode - zero + numberOffset);\n\t }\n\t\n\t // 62: +\n\t if (charCode == plus) {\n\t return 62;\n\t }\n\t\n\t // 63: /\n\t if (charCode == slash) {\n\t return 63;\n\t }\n\t\n\t // Invalid base64 digit.\n\t return -1;\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t/**\n\t * This is a helper function for getting values from parameter/options\n\t * objects.\n\t *\n\t * @param args The object we are extracting values from\n\t * @param name The name of the property we are getting.\n\t * @param defaultValue An optional value to return if the property is missing\n\t * from the object. If this is not specified and the property is missing, an\n\t * error will be thrown.\n\t */\n\tfunction getArg(aArgs, aName, aDefaultValue) {\n\t if (aName in aArgs) {\n\t return aArgs[aName];\n\t } else if (arguments.length === 3) {\n\t return aDefaultValue;\n\t } else {\n\t throw new Error('\"' + aName + '\" is a required argument.');\n\t }\n\t}\n\texports.getArg = getArg;\n\t\n\tvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\n\tvar dataUrlRegexp = /^data:.+\\,.+$/;\n\t\n\tfunction urlParse(aUrl) {\n\t var match = aUrl.match(urlRegexp);\n\t if (!match) {\n\t return null;\n\t }\n\t return {\n\t scheme: match[1],\n\t auth: match[2],\n\t host: match[3],\n\t port: match[4],\n\t path: match[5]\n\t };\n\t}\n\texports.urlParse = urlParse;\n\t\n\tfunction urlGenerate(aParsedUrl) {\n\t var url = '';\n\t if (aParsedUrl.scheme) {\n\t url += aParsedUrl.scheme + ':';\n\t }\n\t url += '//';\n\t if (aParsedUrl.auth) {\n\t url += aParsedUrl.auth + '@';\n\t }\n\t if (aParsedUrl.host) {\n\t url += aParsedUrl.host;\n\t }\n\t if (aParsedUrl.port) {\n\t url += \":\" + aParsedUrl.port\n\t }\n\t if (aParsedUrl.path) {\n\t url += aParsedUrl.path;\n\t }\n\t return url;\n\t}\n\texports.urlGenerate = urlGenerate;\n\t\n\t/**\n\t * Normalizes a path, or the path portion of a URL:\n\t *\n\t * - Replaces consecutive slashes with one slash.\n\t * - Removes unnecessary '.' parts.\n\t * - Removes unnecessary '<dir>/..' parts.\n\t *\n\t * Based on code in the Node.js 'path' core module.\n\t *\n\t * @param aPath The path or url to normalize.\n\t */\n\tfunction normalize(aPath) {\n\t var path = aPath;\n\t var url = urlParse(aPath);\n\t if (url) {\n\t if (!url.path) {\n\t return aPath;\n\t }\n\t path = url.path;\n\t }\n\t var isAbsolute = exports.isAbsolute(path);\n\t\n\t var parts = path.split(/\\/+/);\n\t for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n\t part = parts[i];\n\t if (part === '.') {\n\t parts.splice(i, 1);\n\t } else if (part === '..') {\n\t up++;\n\t } else if (up > 0) {\n\t if (part === '') {\n\t // The first part is blank if the path is absolute. Trying to go\n\t // above the root is a no-op. Therefore we can remove all '..' parts\n\t // directly after the root.\n\t parts.splice(i + 1, up);\n\t up = 0;\n\t } else {\n\t parts.splice(i, 2);\n\t up--;\n\t }\n\t }\n\t }\n\t path = parts.join('/');\n\t\n\t if (path === '') {\n\t path = isAbsolute ? '/' : '.';\n\t }\n\t\n\t if (url) {\n\t url.path = path;\n\t return urlGenerate(url);\n\t }\n\t return path;\n\t}\n\texports.normalize = normalize;\n\t\n\t/**\n\t * Joins two paths/URLs.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be joined with the root.\n\t *\n\t * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n\t * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n\t * first.\n\t * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n\t * is updated with the result and aRoot is returned. Otherwise the result\n\t * is returned.\n\t * - If aPath is absolute, the result is aPath.\n\t * - Otherwise the two paths are joined with a slash.\n\t * - Joining for example 'http://' and 'www.example.com' is also supported.\n\t */\n\tfunction join(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t if (aPath === \"\") {\n\t aPath = \".\";\n\t }\n\t var aPathUrl = urlParse(aPath);\n\t var aRootUrl = urlParse(aRoot);\n\t if (aRootUrl) {\n\t aRoot = aRootUrl.path || '/';\n\t }\n\t\n\t // `join(foo, '//www.example.org')`\n\t if (aPathUrl && !aPathUrl.scheme) {\n\t if (aRootUrl) {\n\t aPathUrl.scheme = aRootUrl.scheme;\n\t }\n\t return urlGenerate(aPathUrl);\n\t }\n\t\n\t if (aPathUrl || aPath.match(dataUrlRegexp)) {\n\t return aPath;\n\t }\n\t\n\t // `join('http://', 'www.example.com')`\n\t if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n\t aRootUrl.host = aPath;\n\t return urlGenerate(aRootUrl);\n\t }\n\t\n\t var joined = aPath.charAt(0) === '/'\n\t ? aPath\n\t : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\t\n\t if (aRootUrl) {\n\t aRootUrl.path = joined;\n\t return urlGenerate(aRootUrl);\n\t }\n\t return joined;\n\t}\n\texports.join = join;\n\t\n\texports.isAbsolute = function (aPath) {\n\t return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n\t};\n\t\n\t/**\n\t * Make a path relative to a URL or another path.\n\t *\n\t * @param aRoot The root path or URL.\n\t * @param aPath The path or URL to be made relative to aRoot.\n\t */\n\tfunction relative(aRoot, aPath) {\n\t if (aRoot === \"\") {\n\t aRoot = \".\";\n\t }\n\t\n\t aRoot = aRoot.replace(/\\/$/, '');\n\t\n\t // It is possible for the path to be above the root. In this case, simply\n\t // checking whether the root is a prefix of the path won't work. Instead, we\n\t // need to remove components from the root one by one, until either we find\n\t // a prefix that fits, or we run out of components to remove.\n\t var level = 0;\n\t while (aPath.indexOf(aRoot + '/') !== 0) {\n\t var index = aRoot.lastIndexOf(\"/\");\n\t if (index < 0) {\n\t return aPath;\n\t }\n\t\n\t // If the only part of the root that is left is the scheme (i.e. http://,\n\t // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n\t // have exhausted all components, so the path is not relative to the root.\n\t aRoot = aRoot.slice(0, index);\n\t if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n\t return aPath;\n\t }\n\t\n\t ++level;\n\t }\n\t\n\t // Make sure we add a \"../\" for each component we removed from the root.\n\t return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n\t}\n\texports.relative = relative;\n\t\n\tvar supportsNullProto = (function () {\n\t var obj = Object.create(null);\n\t return !('__proto__' in obj);\n\t}());\n\t\n\tfunction identity (s) {\n\t return s;\n\t}\n\t\n\t/**\n\t * Because behavior goes wacky when you set `__proto__` on objects, we\n\t * have to prefix all the strings in our set with an arbitrary character.\n\t *\n\t * See https://github.com/mozilla/source-map/pull/31 and\n\t * https://github.com/mozilla/source-map/issues/30\n\t *\n\t * @param String aStr\n\t */\n\tfunction toSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return '$' + aStr;\n\t }\n\t\n\t return aStr;\n\t}\n\texports.toSetString = supportsNullProto ? identity : toSetString;\n\t\n\tfunction fromSetString(aStr) {\n\t if (isProtoString(aStr)) {\n\t return aStr.slice(1);\n\t }\n\t\n\t return aStr;\n\t}\n\texports.fromSetString = supportsNullProto ? identity : fromSetString;\n\t\n\tfunction isProtoString(s) {\n\t if (!s) {\n\t return false;\n\t }\n\t\n\t var length = s.length;\n\t\n\t if (length < 9 /* \"__proto__\".length */) {\n\t return false;\n\t }\n\t\n\t if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n\t s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n\t s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n\t s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n\t s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n\t s.charCodeAt(length - 9) !== 95 /* '_' */) {\n\t return false;\n\t }\n\t\n\t for (var i = length - 10; i >= 0; i--) {\n\t if (s.charCodeAt(i) !== 36 /* '$' */) {\n\t return false;\n\t }\n\t }\n\t\n\t return true;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings where the original positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same original source/line/column, but different generated\n\t * line and column the same. Useful when searching for a mapping with a\n\t * stubbed out mapping.\n\t */\n\tfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n\t var cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0 || onlyCompareOriginal) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByOriginalPositions = compareByOriginalPositions;\n\t\n\t/**\n\t * Comparator between two mappings with deflated source and name indices where\n\t * the generated positions are compared.\n\t *\n\t * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n\t * mappings with the same generated line and column, but different\n\t * source/name/original line and column the same. Useful when searching for a\n\t * mapping with a stubbed out mapping.\n\t */\n\tfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0 || onlyCompareGenerated) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\t\n\tfunction strcmp(aStr1, aStr2) {\n\t if (aStr1 === aStr2) {\n\t return 0;\n\t }\n\t\n\t if (aStr1 === null) {\n\t return 1; // aStr2 !== null\n\t }\n\t\n\t if (aStr2 === null) {\n\t return -1; // aStr1 !== null\n\t }\n\t\n\t if (aStr1 > aStr2) {\n\t return 1;\n\t }\n\t\n\t return -1;\n\t}\n\t\n\t/**\n\t * Comparator between two mappings with inflated source and name strings where\n\t * the generated positions are compared.\n\t */\n\tfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n\t var cmp = mappingA.generatedLine - mappingB.generatedLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = strcmp(mappingA.source, mappingB.source);\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalLine - mappingB.originalLine;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t cmp = mappingA.originalColumn - mappingB.originalColumn;\n\t if (cmp !== 0) {\n\t return cmp;\n\t }\n\t\n\t return strcmp(mappingA.name, mappingB.name);\n\t}\n\texports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\t\n\t/**\n\t * Strip any JSON XSSI avoidance prefix from the string (as documented\n\t * in the source maps specification), and then parse the string as\n\t * JSON.\n\t */\n\tfunction parseSourceMapInput(str) {\n\t return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n\t}\n\texports.parseSourceMapInput = parseSourceMapInput;\n\t\n\t/**\n\t * Compute the URL of a source given the the source root, the source's\n\t * URL, and the source map's URL.\n\t */\n\tfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n\t sourceURL = sourceURL || '';\n\t\n\t if (sourceRoot) {\n\t // This follows what Chrome does.\n\t if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n\t sourceRoot += '/';\n\t }\n\t // The spec says:\n\t // Line 4: An optional source root, useful for relocating source\n\t // files on a server or removing repeated values in the\n\t // “sources” entry. This value is prepended to the individual\n\t // entries in the “source” field.\n\t sourceURL = sourceRoot + sourceURL;\n\t }\n\t\n\t // Historically, SourceMapConsumer did not take the sourceMapURL as\n\t // a parameter. This mode is still somewhat supported, which is why\n\t // this code block is conditional. However, it's preferable to pass\n\t // the source map URL to SourceMapConsumer, so that this function\n\t // can implement the source URL resolution algorithm as outlined in\n\t // the spec. This block is basically the equivalent of:\n\t // new URL(sourceURL, sourceMapURL).toString()\n\t // ... except it avoids using URL, which wasn't available in the\n\t // older releases of node still supported by this library.\n\t //\n\t // The spec says:\n\t // If the sources are not absolute URLs after prepending of the\n\t // “sourceRoot”, the sources are resolved relative to the\n\t // SourceMap (like resolving script src in a html document).\n\t if (sourceMapURL) {\n\t var parsed = urlParse(sourceMapURL);\n\t if (!parsed) {\n\t throw new Error(\"sourceMapURL could not be parsed\");\n\t }\n\t if (parsed.path) {\n\t // Strip the last path component, but keep the \"/\".\n\t var index = parsed.path.lastIndexOf('/');\n\t if (index >= 0) {\n\t parsed.path = parsed.path.substring(0, index + 1);\n\t }\n\t }\n\t sourceURL = join(urlGenerate(parsed), sourceURL);\n\t }\n\t\n\t return normalize(sourceURL);\n\t}\n\texports.computeSourceURL = computeSourceURL;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar has = Object.prototype.hasOwnProperty;\n\tvar hasNativeMap = typeof Map !== \"undefined\";\n\t\n\t/**\n\t * A data structure which is a combination of an array and a set. Adding a new\n\t * member is O(1), testing for membership is O(1), and finding the index of an\n\t * element is O(1). Removing elements from the set is not supported. Only\n\t * strings are supported for membership.\n\t */\n\tfunction ArraySet() {\n\t this._array = [];\n\t this._set = hasNativeMap ? new Map() : Object.create(null);\n\t}\n\t\n\t/**\n\t * Static method for creating ArraySet instances from an existing array.\n\t */\n\tArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n\t var set = new ArraySet();\n\t for (var i = 0, len = aArray.length; i < len; i++) {\n\t set.add(aArray[i], aAllowDuplicates);\n\t }\n\t return set;\n\t};\n\t\n\t/**\n\t * Return how many unique items are in this ArraySet. If duplicates have been\n\t * added, than those do not count towards the size.\n\t *\n\t * @returns Number\n\t */\n\tArraySet.prototype.size = function ArraySet_size() {\n\t return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n\t};\n\t\n\t/**\n\t * Add the given string to this set.\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n\t var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n\t var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n\t var idx = this._array.length;\n\t if (!isDuplicate || aAllowDuplicates) {\n\t this._array.push(aStr);\n\t }\n\t if (!isDuplicate) {\n\t if (hasNativeMap) {\n\t this._set.set(aStr, idx);\n\t } else {\n\t this._set[sStr] = idx;\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Is the given string a member of this set?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.has = function ArraySet_has(aStr) {\n\t if (hasNativeMap) {\n\t return this._set.has(aStr);\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t return has.call(this._set, sStr);\n\t }\n\t};\n\t\n\t/**\n\t * What is the index of the given string in the array?\n\t *\n\t * @param String aStr\n\t */\n\tArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n\t if (hasNativeMap) {\n\t var idx = this._set.get(aStr);\n\t if (idx >= 0) {\n\t return idx;\n\t }\n\t } else {\n\t var sStr = util.toSetString(aStr);\n\t if (has.call(this._set, sStr)) {\n\t return this._set[sStr];\n\t }\n\t }\n\t\n\t throw new Error('\"' + aStr + '\" is not in the set.');\n\t};\n\t\n\t/**\n\t * What is the element at the given index?\n\t *\n\t * @param Number aIdx\n\t */\n\tArraySet.prototype.at = function ArraySet_at(aIdx) {\n\t if (aIdx >= 0 && aIdx < this._array.length) {\n\t return this._array[aIdx];\n\t }\n\t throw new Error('No element indexed by ' + aIdx);\n\t};\n\t\n\t/**\n\t * Returns the array representation of this set (which has the proper indices\n\t * indicated by indexOf). Note that this is a copy of the internal array used\n\t * for storing the members so that no one can mess with internal state.\n\t */\n\tArraySet.prototype.toArray = function ArraySet_toArray() {\n\t return this._array.slice();\n\t};\n\t\n\texports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2014 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\t\n\t/**\n\t * Determine whether mappingB is after mappingA with respect to generated\n\t * position.\n\t */\n\tfunction generatedPositionAfter(mappingA, mappingB) {\n\t // Optimized for most common case\n\t var lineA = mappingA.generatedLine;\n\t var lineB = mappingB.generatedLine;\n\t var columnA = mappingA.generatedColumn;\n\t var columnB = mappingB.generatedColumn;\n\t return lineB > lineA || lineB == lineA && columnB >= columnA ||\n\t util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n\t}\n\t\n\t/**\n\t * A data structure to provide a sorted view of accumulated mappings in a\n\t * performance conscious manner. It trades a neglibable overhead in general\n\t * case for a large speedup in case of mappings being added in order.\n\t */\n\tfunction MappingList() {\n\t this._array = [];\n\t this._sorted = true;\n\t // Serves as infimum\n\t this._last = {generatedLine: -1, generatedColumn: 0};\n\t}\n\t\n\t/**\n\t * Iterate through internal items. This method takes the same arguments that\n\t * `Array.prototype.forEach` takes.\n\t *\n\t * NOTE: The order of the mappings is NOT guaranteed.\n\t */\n\tMappingList.prototype.unsortedForEach =\n\t function MappingList_forEach(aCallback, aThisArg) {\n\t this._array.forEach(aCallback, aThisArg);\n\t };\n\t\n\t/**\n\t * Add the given source mapping.\n\t *\n\t * @param Object aMapping\n\t */\n\tMappingList.prototype.add = function MappingList_add(aMapping) {\n\t if (generatedPositionAfter(this._last, aMapping)) {\n\t this._last = aMapping;\n\t this._array.push(aMapping);\n\t } else {\n\t this._sorted = false;\n\t this._array.push(aMapping);\n\t }\n\t};\n\t\n\t/**\n\t * Returns the flat, sorted array of mappings. The mappings are sorted by\n\t * generated position.\n\t *\n\t * WARNING: This method returns internal data without copying, for\n\t * performance. The return value must NOT be mutated, and should be treated as\n\t * an immutable borrow. If you want to take ownership, you must make your own\n\t * copy.\n\t */\n\tMappingList.prototype.toArray = function MappingList_toArray() {\n\t if (!this._sorted) {\n\t this._array.sort(util.compareByGeneratedPositionsInflated);\n\t this._sorted = true;\n\t }\n\t return this._array;\n\t};\n\t\n\texports.MappingList = MappingList;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar util = __webpack_require__(4);\n\tvar binarySearch = __webpack_require__(8);\n\tvar ArraySet = __webpack_require__(5).ArraySet;\n\tvar base64VLQ = __webpack_require__(2);\n\tvar quickSort = __webpack_require__(9).quickSort;\n\t\n\tfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t return sourceMap.sections != null\n\t ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n\t : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n\t}\n\t\n\tSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n\t return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n\t}\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tSourceMapConsumer.prototype._version = 3;\n\t\n\t// `__generatedMappings` and `__originalMappings` are arrays that hold the\n\t// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n\t// are lazily instantiated, accessed via the `_generatedMappings` and\n\t// `_originalMappings` getters respectively, and we only parse the mappings\n\t// and create these arrays once queried for a source location. We jump through\n\t// these hoops because there can be many thousands of mappings, and parsing\n\t// them is expensive, so we only want to do it if we must.\n\t//\n\t// Each object in the arrays is of the form:\n\t//\n\t// {\n\t// generatedLine: The line number in the generated code,\n\t// generatedColumn: The column number in the generated code,\n\t// source: The path to the original source file that generated this\n\t// chunk of code,\n\t// originalLine: The line number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// originalColumn: The column number in the original source that\n\t// corresponds to this chunk of generated code,\n\t// name: The name of the original symbol which generated this chunk of\n\t// code.\n\t// }\n\t//\n\t// All properties except for `generatedLine` and `generatedColumn` can be\n\t// `null`.\n\t//\n\t// `_generatedMappings` is ordered by the generated positions.\n\t//\n\t// `_originalMappings` is ordered by the original positions.\n\t\n\tSourceMapConsumer.prototype.__generatedMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n\t configurable: true,\n\t enumerable: true,\n\t get: function () {\n\t if (!this.__generatedMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__generatedMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype.__originalMappings = null;\n\tObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n\t configurable: true,\n\t enumerable: true,\n\t get: function () {\n\t if (!this.__originalMappings) {\n\t this._parseMappings(this._mappings, this.sourceRoot);\n\t }\n\t\n\t return this.__originalMappings;\n\t }\n\t});\n\t\n\tSourceMapConsumer.prototype._charIsMappingSeparator =\n\t function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n\t var c = aStr.charAt(index);\n\t return c === \";\" || c === \",\";\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t throw new Error(\"Subclasses must implement _parseMappings\");\n\t };\n\t\n\tSourceMapConsumer.GENERATED_ORDER = 1;\n\tSourceMapConsumer.ORIGINAL_ORDER = 2;\n\t\n\tSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\n\tSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Iterate over each mapping between an original source/line/column and a\n\t * generated line/column in this source map.\n\t *\n\t * @param Function aCallback\n\t * The function that is called with each mapping.\n\t * @param Object aContext\n\t * Optional. If specified, this object will be the value of `this` every\n\t * time that `aCallback` is called.\n\t * @param aOrder\n\t * Either `SourceMapConsumer.GENERATED_ORDER` or\n\t * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n\t * iterate over the mappings sorted by the generated file's line/column\n\t * order or the original's source/line/column order, respectively. Defaults to\n\t * `SourceMapConsumer.GENERATED_ORDER`.\n\t */\n\tSourceMapConsumer.prototype.eachMapping =\n\t function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n\t var context = aContext || null;\n\t var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\t\n\t var mappings;\n\t switch (order) {\n\t case SourceMapConsumer.GENERATED_ORDER:\n\t mappings = this._generatedMappings;\n\t break;\n\t case SourceMapConsumer.ORIGINAL_ORDER:\n\t mappings = this._originalMappings;\n\t break;\n\t default:\n\t throw new Error(\"Unknown order of iteration.\");\n\t }\n\t\n\t var sourceRoot = this.sourceRoot;\n\t mappings.map(function (mapping) {\n\t var source = mapping.source === null ? null : this._sources.at(mapping.source);\n\t source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n\t return {\n\t source: source,\n\t generatedLine: mapping.generatedLine,\n\t generatedColumn: mapping.generatedColumn,\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: mapping.name === null ? null : this._names.at(mapping.name)\n\t };\n\t }, this).forEach(aCallback, context);\n\t };\n\t\n\t/**\n\t * Returns all generated line and column information for the original source,\n\t * line, and column provided. If no column is provided, returns all mappings\n\t * corresponding to a either the line we are searching for or the next\n\t * closest line that has any mappings. Otherwise, returns all mappings\n\t * corresponding to the given line and either the column we are searching for\n\t * or the next closest column that has any offsets.\n\t *\n\t * The only argument is an object with the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number is 1-based.\n\t * - column: Optional. the column number in the original source.\n\t * The column number is 0-based.\n\t *\n\t * and an array of objects is returned, each with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tSourceMapConsumer.prototype.allGeneratedPositionsFor =\n\t function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n\t var line = util.getArg(aArgs, 'line');\n\t\n\t // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n\t // returns the index of the closest mapping less than the needle. By\n\t // setting needle.originalColumn to 0, we thus find the last mapping for\n\t // the given line, provided such a mapping exists.\n\t var needle = {\n\t source: util.getArg(aArgs, 'source'),\n\t originalLine: line,\n\t originalColumn: util.getArg(aArgs, 'column', 0)\n\t };\n\t\n\t needle.source = this._findSourceIndex(needle.source);\n\t if (needle.source < 0) {\n\t return [];\n\t }\n\t\n\t var mappings = [];\n\t\n\t var index = this._findMapping(needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t binarySearch.LEAST_UPPER_BOUND);\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (aArgs.column === undefined) {\n\t var originalLine = mapping.originalLine;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we found. Since\n\t // mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we found.\n\t while (mapping && mapping.originalLine === originalLine) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t } else {\n\t var originalColumn = mapping.originalColumn;\n\t\n\t // Iterate until either we run out of mappings, or we run into\n\t // a mapping for a different line than the one we were searching for.\n\t // Since mappings are sorted, this is guaranteed to find all mappings for\n\t // the line we are searching for.\n\t while (mapping &&\n\t mapping.originalLine === line &&\n\t mapping.originalColumn == originalColumn) {\n\t mappings.push({\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t });\n\t\n\t mapping = this._originalMappings[++index];\n\t }\n\t }\n\t }\n\t\n\t return mappings;\n\t };\n\t\n\texports.SourceMapConsumer = SourceMapConsumer;\n\t\n\t/**\n\t * A BasicSourceMapConsumer instance represents a parsed source map which we can\n\t * query for information about the original file positions by giving it a file\n\t * position in the generated source.\n\t *\n\t * The first parameter is the raw source map (either as a JSON string, or\n\t * already parsed to an object). According to the spec, source maps have the\n\t * following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - sources: An array of URLs to the original source files.\n\t * - names: An array of identifiers which can be referrenced by individual mappings.\n\t * - sourceRoot: Optional. The URL root from which all sources are relative.\n\t * - sourcesContent: Optional. An array of contents of the original source files.\n\t * - mappings: A string of base64 VLQs which contain the actual mappings.\n\t * - file: Optional. The generated file this source map is associated with.\n\t *\n\t * Here is an example source map, taken from the source map spec[0]:\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"out.js\",\n\t * sourceRoot : \"\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AA,AB;;ABCDE;\"\n\t * }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n\t */\n\tfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sources = util.getArg(sourceMap, 'sources');\n\t // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n\t // requires the array) to play nice here.\n\t var names = util.getArg(sourceMap, 'names', []);\n\t var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n\t var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n\t var mappings = util.getArg(sourceMap, 'mappings');\n\t var file = util.getArg(sourceMap, 'file', null);\n\t\n\t // Once again, Sass deviates from the spec and supplies the version as a\n\t // string rather than a number, so we use loose equality checking here.\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t if (sourceRoot) {\n\t sourceRoot = util.normalize(sourceRoot);\n\t }\n\t\n\t sources = sources\n\t .map(String)\n\t // Some source maps produce relative source paths like \"./foo.js\" instead of\n\t // \"foo.js\". Normalize these first so that future comparisons will succeed.\n\t // See bugzil.la/1090768.\n\t .map(util.normalize)\n\t // Always ensure that absolute sources are internally stored relative to\n\t // the source root, if the source root is absolute. Not doing this would\n\t // be particularly problematic when the source root is a prefix of the\n\t // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n\t .map(function (source) {\n\t return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n\t ? util.relative(sourceRoot, source)\n\t : source;\n\t });\n\t\n\t // Pass `true` below to allow duplicate names and sources. While source maps\n\t // are intended to be compressed and deduplicated, the TypeScript compiler\n\t // sometimes generates source maps with duplicates in them. See Github issue\n\t // #72 and bugzil.la/889492.\n\t this._names = ArraySet.fromArray(names.map(String), true);\n\t this._sources = ArraySet.fromArray(sources, true);\n\t\n\t this._absoluteSources = this._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n\t });\n\t\n\t this.sourceRoot = sourceRoot;\n\t this.sourcesContent = sourcesContent;\n\t this._mappings = mappings;\n\t this._sourceMapURL = aSourceMapURL;\n\t this.file = file;\n\t}\n\t\n\tBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\t\n\t/**\n\t * Utility function to find the index of a source. Returns -1 if not\n\t * found.\n\t */\n\tBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t }\n\t\n\t if (this._sources.has(relativeSource)) {\n\t return this._sources.indexOf(relativeSource);\n\t }\n\t\n\t // Maybe aSource is an absolute URL as returned by |sources|. In\n\t // this case we can't simply undo the transform.\n\t var i;\n\t for (i = 0; i < this._absoluteSources.length; ++i) {\n\t if (this._absoluteSources[i] == aSource) {\n\t return i;\n\t }\n\t }\n\t\n\t return -1;\n\t};\n\t\n\t/**\n\t * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n\t *\n\t * @param SourceMapGenerator aSourceMap\n\t * The source map that will be consumed.\n\t * @param String aSourceMapURL\n\t * The URL at which the source map can be found (optional)\n\t * @returns BasicSourceMapConsumer\n\t */\n\tBasicSourceMapConsumer.fromSourceMap =\n\t function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n\t var smc = Object.create(BasicSourceMapConsumer.prototype);\n\t\n\t var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n\t var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n\t smc.sourceRoot = aSourceMap._sourceRoot;\n\t smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n\t smc.sourceRoot);\n\t smc.file = aSourceMap._file;\n\t smc._sourceMapURL = aSourceMapURL;\n\t smc._absoluteSources = smc._sources.toArray().map(function (s) {\n\t return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n\t });\n\t\n\t // Because we are modifying the entries (by converting string sources and\n\t // names to indices into the sources and names ArraySets), we have to make\n\t // a copy of the entry or else bad things happen. Shared mutable state\n\t // strikes again! See github issue #191.\n\t\n\t var generatedMappings = aSourceMap._mappings.toArray().slice();\n\t var destGeneratedMappings = smc.__generatedMappings = [];\n\t var destOriginalMappings = smc.__originalMappings = [];\n\t\n\t for (var i = 0, length = generatedMappings.length; i < length; i++) {\n\t var srcMapping = generatedMappings[i];\n\t var destMapping = new Mapping;\n\t destMapping.generatedLine = srcMapping.generatedLine;\n\t destMapping.generatedColumn = srcMapping.generatedColumn;\n\t\n\t if (srcMapping.source) {\n\t destMapping.source = sources.indexOf(srcMapping.source);\n\t destMapping.originalLine = srcMapping.originalLine;\n\t destMapping.originalColumn = srcMapping.originalColumn;\n\t\n\t if (srcMapping.name) {\n\t destMapping.name = names.indexOf(srcMapping.name);\n\t }\n\t\n\t destOriginalMappings.push(destMapping);\n\t }\n\t\n\t destGeneratedMappings.push(destMapping);\n\t }\n\t\n\t quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\t\n\t return smc;\n\t };\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tBasicSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t return this._absoluteSources.slice();\n\t }\n\t});\n\t\n\t/**\n\t * Provide the JIT with a nice shape / hidden class.\n\t */\n\tfunction Mapping() {\n\t this.generatedLine = 0;\n\t this.generatedColumn = 0;\n\t this.source = null;\n\t this.originalLine = null;\n\t this.originalColumn = null;\n\t this.name = null;\n\t}\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tBasicSourceMapConsumer.prototype._parseMappings =\n\t function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t var generatedLine = 1;\n\t var previousGeneratedColumn = 0;\n\t var previousOriginalLine = 0;\n\t var previousOriginalColumn = 0;\n\t var previousSource = 0;\n\t var previousName = 0;\n\t var length = aStr.length;\n\t var index = 0;\n\t var cachedSegments = {};\n\t var temp = {};\n\t var originalMappings = [];\n\t var generatedMappings = [];\n\t var mapping, str, segment, end, value;\n\t\n\t while (index < length) {\n\t if (aStr.charAt(index) === ';') {\n\t generatedLine++;\n\t index++;\n\t previousGeneratedColumn = 0;\n\t }\n\t else if (aStr.charAt(index) === ',') {\n\t index++;\n\t }\n\t else {\n\t mapping = new Mapping();\n\t mapping.generatedLine = generatedLine;\n\t\n\t // Because each offset is encoded relative to the previous one,\n\t // many segments often have the same encoding. We can exploit this\n\t // fact by caching the parsed variable length fields of each segment,\n\t // allowing us to avoid a second parse if we encounter the same\n\t // segment again.\n\t for (end = index; end < length; end++) {\n\t if (this._charIsMappingSeparator(aStr, end)) {\n\t break;\n\t }\n\t }\n\t str = aStr.slice(index, end);\n\t\n\t segment = cachedSegments[str];\n\t if (segment) {\n\t index += str.length;\n\t } else {\n\t segment = [];\n\t while (index < end) {\n\t base64VLQ.decode(aStr, index, temp);\n\t value = temp.value;\n\t index = temp.rest;\n\t segment.push(value);\n\t }\n\t\n\t if (segment.length === 2) {\n\t throw new Error('Found a source, but no line and column');\n\t }\n\t\n\t if (segment.length === 3) {\n\t throw new Error('Found a source and line, but no column');\n\t }\n\t\n\t cachedSegments[str] = segment;\n\t }\n\t\n\t // Generated column.\n\t mapping.generatedColumn = previousGeneratedColumn + segment[0];\n\t previousGeneratedColumn = mapping.generatedColumn;\n\t\n\t if (segment.length > 1) {\n\t // Original source.\n\t mapping.source = previousSource + segment[1];\n\t previousSource += segment[1];\n\t\n\t // Original line.\n\t mapping.originalLine = previousOriginalLine + segment[2];\n\t previousOriginalLine = mapping.originalLine;\n\t // Lines are stored 0-based\n\t mapping.originalLine += 1;\n\t\n\t // Original column.\n\t mapping.originalColumn = previousOriginalColumn + segment[3];\n\t previousOriginalColumn = mapping.originalColumn;\n\t\n\t if (segment.length > 4) {\n\t // Original name.\n\t mapping.name = previousName + segment[4];\n\t previousName += segment[4];\n\t }\n\t }\n\t\n\t generatedMappings.push(mapping);\n\t if (typeof mapping.originalLine === 'number') {\n\t originalMappings.push(mapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t this.__generatedMappings = generatedMappings;\n\t\n\t quickSort(originalMappings, util.compareByOriginalPositions);\n\t this.__originalMappings = originalMappings;\n\t };\n\t\n\t/**\n\t * Find the mapping that best matches the hypothetical \"needle\" mapping that\n\t * we are searching for in the given \"haystack\" of mappings.\n\t */\n\tBasicSourceMapConsumer.prototype._findMapping =\n\t function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n\t aColumnName, aComparator, aBias) {\n\t // To return the position we are searching for, we must first find the\n\t // mapping for the given position and then return the opposite position it\n\t // points to. Because the mappings are sorted, we can use binary search to\n\t // find the best mapping.\n\t\n\t if (aNeedle[aLineName] <= 0) {\n\t throw new TypeError('Line must be greater than or equal to 1, got '\n\t + aNeedle[aLineName]);\n\t }\n\t if (aNeedle[aColumnName] < 0) {\n\t throw new TypeError('Column must be greater than or equal to 0, got '\n\t + aNeedle[aColumnName]);\n\t }\n\t\n\t return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n\t };\n\t\n\t/**\n\t * Compute the last column for each generated mapping. The last column is\n\t * inclusive.\n\t */\n\tBasicSourceMapConsumer.prototype.computeColumnSpans =\n\t function SourceMapConsumer_computeColumnSpans() {\n\t for (var index = 0; index < this._generatedMappings.length; ++index) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t // Mappings do not contain a field for the last generated columnt. We\n\t // can come up with an optimistic estimate, however, by assuming that\n\t // mappings are contiguous (i.e. given two consecutive mappings, the\n\t // first mapping ends where the second one starts).\n\t if (index + 1 < this._generatedMappings.length) {\n\t var nextMapping = this._generatedMappings[index + 1];\n\t\n\t if (mapping.generatedLine === nextMapping.generatedLine) {\n\t mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n\t continue;\n\t }\n\t }\n\t\n\t // The last mapping for each line spans the entire line.\n\t mapping.lastGeneratedColumn = Infinity;\n\t }\n\t };\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\n\t * - name: The original identifier, or null.\n\t */\n\tBasicSourceMapConsumer.prototype.originalPositionFor =\n\t function SourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._generatedMappings,\n\t \"generatedLine\",\n\t \"generatedColumn\",\n\t util.compareByGeneratedPositionsDeflated,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._generatedMappings[index];\n\t\n\t if (mapping.generatedLine === needle.generatedLine) {\n\t var source = util.getArg(mapping, 'source', null);\n\t if (source !== null) {\n\t source = this._sources.at(source);\n\t source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n\t }\n\t var name = util.getArg(mapping, 'name', null);\n\t if (name !== null) {\n\t name = this._names.at(name);\n\t }\n\t return {\n\t source: source,\n\t line: util.getArg(mapping, 'originalLine', null),\n\t column: util.getArg(mapping, 'originalColumn', null),\n\t name: name\n\t };\n\t }\n\t }\n\t\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function BasicSourceMapConsumer_hasContentsOfAllSources() {\n\t if (!this.sourcesContent) {\n\t return false;\n\t }\n\t return this.sourcesContent.length >= this._sources.size() &&\n\t !this.sourcesContent.some(function (sc) { return sc == null; });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tBasicSourceMapConsumer.prototype.sourceContentFor =\n\t function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t if (!this.sourcesContent) {\n\t return null;\n\t }\n\t\n\t var index = this._findSourceIndex(aSource);\n\t if (index >= 0) {\n\t return this.sourcesContent[index];\n\t }\n\t\n\t var relativeSource = aSource;\n\t if (this.sourceRoot != null) {\n\t relativeSource = util.relative(this.sourceRoot, relativeSource);\n\t }\n\t\n\t var url;\n\t if (this.sourceRoot != null\n\t && (url = util.urlParse(this.sourceRoot))) {\n\t // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n\t // many users. We can help them out when they expect file:// URIs to\n\t // behave like it would if they were running a local HTTP server. See\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n\t var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n\t if (url.scheme == \"file\"\n\t && this._sources.has(fileUriAbsPath)) {\n\t return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n\t }\n\t\n\t if ((!url.path || url.path == \"/\")\n\t && this._sources.has(\"/\" + relativeSource)) {\n\t return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n\t }\n\t }\n\t\n\t // This function is used recursively from\n\t // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n\t // don't want to throw if we can't find the source - we just want to\n\t // return null, so we provide a flag to exit gracefully.\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\n\t * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n\t * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tBasicSourceMapConsumer.prototype.generatedPositionFor =\n\t function SourceMapConsumer_generatedPositionFor(aArgs) {\n\t var source = util.getArg(aArgs, 'source');\n\t source = this._findSourceIndex(source);\n\t if (source < 0) {\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t }\n\t\n\t var needle = {\n\t source: source,\n\t originalLine: util.getArg(aArgs, 'line'),\n\t originalColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t var index = this._findMapping(\n\t needle,\n\t this._originalMappings,\n\t \"originalLine\",\n\t \"originalColumn\",\n\t util.compareByOriginalPositions,\n\t util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n\t );\n\t\n\t if (index >= 0) {\n\t var mapping = this._originalMappings[index];\n\t\n\t if (mapping.source === needle.source) {\n\t return {\n\t line: util.getArg(mapping, 'generatedLine', null),\n\t column: util.getArg(mapping, 'generatedColumn', null),\n\t lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n\t };\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null,\n\t lastColumn: null\n\t };\n\t };\n\t\n\texports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\t\n\t/**\n\t * An IndexedSourceMapConsumer instance represents a parsed source map which\n\t * we can query for information. It differs from BasicSourceMapConsumer in\n\t * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n\t * input.\n\t *\n\t * The first parameter is a raw source map (either as a JSON string, or already\n\t * parsed to an object). According to the spec for indexed source maps, they\n\t * have the following attributes:\n\t *\n\t * - version: Which version of the source map spec this map is following.\n\t * - file: Optional. The generated file this source map is associated with.\n\t * - sections: A list of section definitions.\n\t *\n\t * Each value under the \"sections\" field has two fields:\n\t * - offset: The offset into the original specified at which this section\n\t * begins to apply, defined as an object with a \"line\" and \"column\"\n\t * field.\n\t * - map: A source map definition. This source map could also be indexed,\n\t * but doesn't have to be.\n\t *\n\t * Instead of the \"map\" field, it's also possible to have a \"url\" field\n\t * specifying a URL to retrieve a source map from, but that's currently\n\t * unsupported.\n\t *\n\t * Here's an example source map, taken from the source map spec[0], but\n\t * modified to omit a section which uses the \"url\" field.\n\t *\n\t * {\n\t * version : 3,\n\t * file: \"app.js\",\n\t * sections: [{\n\t * offset: {line:100, column:10},\n\t * map: {\n\t * version : 3,\n\t * file: \"section.js\",\n\t * sources: [\"foo.js\", \"bar.js\"],\n\t * names: [\"src\", \"maps\", \"are\", \"fun\"],\n\t * mappings: \"AAAA,E;;ABCDE;\"\n\t * }\n\t * }],\n\t * }\n\t *\n\t * The second parameter, if given, is a string whose value is the URL\n\t * at which the source map was found. This URL is used to compute the\n\t * sources array.\n\t *\n\t * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n\t */\n\tfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n\t var sourceMap = aSourceMap;\n\t if (typeof aSourceMap === 'string') {\n\t sourceMap = util.parseSourceMapInput(aSourceMap);\n\t }\n\t\n\t var version = util.getArg(sourceMap, 'version');\n\t var sections = util.getArg(sourceMap, 'sections');\n\t\n\t if (version != this._version) {\n\t throw new Error('Unsupported version: ' + version);\n\t }\n\t\n\t this._sources = new ArraySet();\n\t this._names = new ArraySet();\n\t\n\t var lastOffset = {\n\t line: -1,\n\t column: 0\n\t };\n\t this._sections = sections.map(function (s) {\n\t if (s.url) {\n\t // The url field will require support for asynchronicity.\n\t // See https://github.com/mozilla/source-map/issues/16\n\t throw new Error('Support for url field in sections not implemented.');\n\t }\n\t var offset = util.getArg(s, 'offset');\n\t var offsetLine = util.getArg(offset, 'line');\n\t var offsetColumn = util.getArg(offset, 'column');\n\t\n\t if (offsetLine < lastOffset.line ||\n\t (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n\t throw new Error('Section offsets must be ordered and non-overlapping.');\n\t }\n\t lastOffset = offset;\n\t\n\t return {\n\t generatedOffset: {\n\t // The offset fields are 0-based, but we use 1-based indices when\n\t // encoding/decoding from VLQ.\n\t generatedLine: offsetLine + 1,\n\t generatedColumn: offsetColumn + 1\n\t },\n\t consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n\t }\n\t });\n\t}\n\t\n\tIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\n\tIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\t\n\t/**\n\t * The version of the source mapping spec that we are consuming.\n\t */\n\tIndexedSourceMapConsumer.prototype._version = 3;\n\t\n\t/**\n\t * The list of original sources.\n\t */\n\tObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n\t get: function () {\n\t var sources = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n\t sources.push(this._sections[i].consumer.sources[j]);\n\t }\n\t }\n\t return sources;\n\t }\n\t});\n\t\n\t/**\n\t * Returns the original source, line, and column information for the generated\n\t * source's line and column positions provided. The only argument is an object\n\t * with the following properties:\n\t *\n\t * - line: The line number in the generated source. The line number\n\t * is 1-based.\n\t * - column: The column number in the generated source. The column\n\t * number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - source: The original source file, or null.\n\t * - line: The line number in the original source, or null. The\n\t * line number is 1-based.\n\t * - column: The column number in the original source, or null. The\n\t * column number is 0-based.\n\t * - name: The original identifier, or null.\n\t */\n\tIndexedSourceMapConsumer.prototype.originalPositionFor =\n\t function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n\t var needle = {\n\t generatedLine: util.getArg(aArgs, 'line'),\n\t generatedColumn: util.getArg(aArgs, 'column')\n\t };\n\t\n\t // Find the section containing the generated position we're trying to map\n\t // to an original position.\n\t var sectionIndex = binarySearch.search(needle, this._sections,\n\t function(needle, section) {\n\t var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n\t if (cmp) {\n\t return cmp;\n\t }\n\t\n\t return (needle.generatedColumn -\n\t section.generatedOffset.generatedColumn);\n\t });\n\t var section = this._sections[sectionIndex];\n\t\n\t if (!section) {\n\t return {\n\t source: null,\n\t line: null,\n\t column: null,\n\t name: null\n\t };\n\t }\n\t\n\t return section.consumer.originalPositionFor({\n\t line: needle.generatedLine -\n\t (section.generatedOffset.generatedLine - 1),\n\t column: needle.generatedColumn -\n\t (section.generatedOffset.generatedLine === needle.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t bias: aArgs.bias\n\t });\n\t };\n\t\n\t/**\n\t * Return true if we have the source content for every source in the source\n\t * map, false otherwise.\n\t */\n\tIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n\t function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n\t return this._sections.every(function (s) {\n\t return s.consumer.hasContentsOfAllSources();\n\t });\n\t };\n\t\n\t/**\n\t * Returns the original source content. The only argument is the url of the\n\t * original source file. Returns null if no original source content is\n\t * available.\n\t */\n\tIndexedSourceMapConsumer.prototype.sourceContentFor =\n\t function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t var content = section.consumer.sourceContentFor(aSource, true);\n\t if (content) {\n\t return content;\n\t }\n\t }\n\t if (nullOnMissing) {\n\t return null;\n\t }\n\t else {\n\t throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n\t }\n\t };\n\t\n\t/**\n\t * Returns the generated line and column information for the original source,\n\t * line, and column positions provided. The only argument is an object with\n\t * the following properties:\n\t *\n\t * - source: The filename of the original source.\n\t * - line: The line number in the original source. The line number\n\t * is 1-based.\n\t * - column: The column number in the original source. The column\n\t * number is 0-based.\n\t *\n\t * and an object is returned with the following properties:\n\t *\n\t * - line: The line number in the generated source, or null. The\n\t * line number is 1-based. \n\t * - column: The column number in the generated source, or null.\n\t * The column number is 0-based.\n\t */\n\tIndexedSourceMapConsumer.prototype.generatedPositionFor =\n\t function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t\n\t // Only consider this section if the requested source is in the list of\n\t // sources of the consumer.\n\t if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n\t continue;\n\t }\n\t var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n\t if (generatedPosition) {\n\t var ret = {\n\t line: generatedPosition.line +\n\t (section.generatedOffset.generatedLine - 1),\n\t column: generatedPosition.column +\n\t (section.generatedOffset.generatedLine === generatedPosition.line\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0)\n\t };\n\t return ret;\n\t }\n\t }\n\t\n\t return {\n\t line: null,\n\t column: null\n\t };\n\t };\n\t\n\t/**\n\t * Parse the mappings in a string in to a data structure which we can easily\n\t * query (the ordered arrays in the `this.__generatedMappings` and\n\t * `this.__originalMappings` properties).\n\t */\n\tIndexedSourceMapConsumer.prototype._parseMappings =\n\t function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n\t this.__generatedMappings = [];\n\t this.__originalMappings = [];\n\t for (var i = 0; i < this._sections.length; i++) {\n\t var section = this._sections[i];\n\t var sectionMappings = section.consumer._generatedMappings;\n\t for (var j = 0; j < sectionMappings.length; j++) {\n\t var mapping = sectionMappings[j];\n\t\n\t var source = section.consumer._sources.at(mapping.source);\n\t source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n\t this._sources.add(source);\n\t source = this._sources.indexOf(source);\n\t\n\t var name = null;\n\t if (mapping.name) {\n\t name = section.consumer._names.at(mapping.name);\n\t this._names.add(name);\n\t name = this._names.indexOf(name);\n\t }\n\t\n\t // The mappings coming from the consumer for the section have\n\t // generated positions relative to the start of the section, so we\n\t // need to offset them to be relative to the start of the concatenated\n\t // generated file.\n\t var adjustedMapping = {\n\t source: source,\n\t generatedLine: mapping.generatedLine +\n\t (section.generatedOffset.generatedLine - 1),\n\t generatedColumn: mapping.generatedColumn +\n\t (section.generatedOffset.generatedLine === mapping.generatedLine\n\t ? section.generatedOffset.generatedColumn - 1\n\t : 0),\n\t originalLine: mapping.originalLine,\n\t originalColumn: mapping.originalColumn,\n\t name: name\n\t };\n\t\n\t this.__generatedMappings.push(adjustedMapping);\n\t if (typeof adjustedMapping.originalLine === 'number') {\n\t this.__originalMappings.push(adjustedMapping);\n\t }\n\t }\n\t }\n\t\n\t quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n\t quickSort(this.__originalMappings, util.compareByOriginalPositions);\n\t };\n\t\n\texports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\texports.GREATEST_LOWER_BOUND = 1;\n\texports.LEAST_UPPER_BOUND = 2;\n\t\n\t/**\n\t * Recursive implementation of binary search.\n\t *\n\t * @param aLow Indices here and lower do not contain the needle.\n\t * @param aHigh Indices here and higher do not contain the needle.\n\t * @param aNeedle The element being searched for.\n\t * @param aHaystack The non-empty array being searched.\n\t * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t */\n\tfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n\t // This function terminates when one of the following is true:\n\t //\n\t // 1. We find the exact element we are looking for.\n\t //\n\t // 2. We did not find the exact element, but we can return the index of\n\t // the next-closest element.\n\t //\n\t // 3. We did not find the exact element, and there is no next-closest\n\t // element than the one we are searching for, so we return -1.\n\t var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n\t var cmp = aCompare(aNeedle, aHaystack[mid], true);\n\t if (cmp === 0) {\n\t // Found the element we are looking for.\n\t return mid;\n\t }\n\t else if (cmp > 0) {\n\t // Our needle is greater than aHaystack[mid].\n\t if (aHigh - mid > 1) {\n\t // The element is in the upper half.\n\t return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // The exact needle element was not found in this haystack. Determine if\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return aHigh < aHaystack.length ? aHigh : -1;\n\t } else {\n\t return mid;\n\t }\n\t }\n\t else {\n\t // Our needle is less than aHaystack[mid].\n\t if (mid - aLow > 1) {\n\t // The element is in the lower half.\n\t return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n\t }\n\t\n\t // we are in termination case (3) or (2) and return the appropriate thing.\n\t if (aBias == exports.LEAST_UPPER_BOUND) {\n\t return mid;\n\t } else {\n\t return aLow < 0 ? -1 : aLow;\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * This is an implementation of binary search which will always try and return\n\t * the index of the closest element if there is no exact hit. This is because\n\t * mappings between original and generated line/col pairs are single points,\n\t * and there is an implicit region between each of them, so a miss just means\n\t * that you aren't on the very start of a region.\n\t *\n\t * @param aNeedle The element you are looking for.\n\t * @param aHaystack The array that is being searched.\n\t * @param aCompare A function which takes the needle and an element in the\n\t * array and returns -1, 0, or 1 depending on whether the needle is less\n\t * than, equal to, or greater than the element, respectively.\n\t * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n\t * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n\t * closest element that is smaller than or greater than the one we are\n\t * searching for, respectively, if the exact element cannot be found.\n\t * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n\t */\n\texports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n\t if (aHaystack.length === 0) {\n\t return -1;\n\t }\n\t\n\t var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n\t aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n\t if (index < 0) {\n\t return -1;\n\t }\n\t\n\t // We have found either the exact element, or the next-closest element than\n\t // the one we are searching for. However, there may be more than one such\n\t // element. Make sure we always return the smallest of these.\n\t while (index - 1 >= 0) {\n\t if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n\t break;\n\t }\n\t --index;\n\t }\n\t\n\t return index;\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\t// It turns out that some (most?) JavaScript engines don't self-host\n\t// `Array.prototype.sort`. This makes sense because C++ will likely remain\n\t// faster than JS when doing raw CPU-intensive sorting. However, when using a\n\t// custom comparator function, calling back and forth between the VM's C++ and\n\t// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n\t// worse generated code for the comparator function than would be optimal. In\n\t// fact, when sorting with a comparator, these costs outweigh the benefits of\n\t// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n\t// a ~3500ms mean speed-up in `bench/bench.html`.\n\t\n\t/**\n\t * Swap the elements indexed by `x` and `y` in the array `ary`.\n\t *\n\t * @param {Array} ary\n\t * The array.\n\t * @param {Number} x\n\t * The index of the first item.\n\t * @param {Number} y\n\t * The index of the second item.\n\t */\n\tfunction swap(ary, x, y) {\n\t var temp = ary[x];\n\t ary[x] = ary[y];\n\t ary[y] = temp;\n\t}\n\t\n\t/**\n\t * Returns a random integer within the range `low .. high` inclusive.\n\t *\n\t * @param {Number} low\n\t * The lower bound on the range.\n\t * @param {Number} high\n\t * The upper bound on the range.\n\t */\n\tfunction randomIntInRange(low, high) {\n\t return Math.round(low + (Math.random() * (high - low)));\n\t}\n\t\n\t/**\n\t * The Quick Sort algorithm.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t * @param {Number} p\n\t * Start index of the array\n\t * @param {Number} r\n\t * End index of the array\n\t */\n\tfunction doQuickSort(ary, comparator, p, r) {\n\t // If our lower bound is less than our upper bound, we (1) partition the\n\t // array into two pieces and (2) recurse on each half. If it is not, this is\n\t // the empty array and our base case.\n\t\n\t if (p < r) {\n\t // (1) Partitioning.\n\t //\n\t // The partitioning chooses a pivot between `p` and `r` and moves all\n\t // elements that are less than or equal to the pivot to the before it, and\n\t // all the elements that are greater than it after it. The effect is that\n\t // once partition is done, the pivot is in the exact place it will be when\n\t // the array is put in sorted order, and it will not need to be moved\n\t // again. This runs in O(n) time.\n\t\n\t // Always choose a random pivot so that an input array which is reverse\n\t // sorted does not cause O(n^2) running time.\n\t var pivotIndex = randomIntInRange(p, r);\n\t var i = p - 1;\n\t\n\t swap(ary, pivotIndex, r);\n\t var pivot = ary[r];\n\t\n\t // Immediately after `j` is incremented in this loop, the following hold\n\t // true:\n\t //\n\t // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n\t //\n\t // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n\t for (var j = p; j < r; j++) {\n\t if (comparator(ary[j], pivot) <= 0) {\n\t i += 1;\n\t swap(ary, i, j);\n\t }\n\t }\n\t\n\t swap(ary, i + 1, j);\n\t var q = i + 1;\n\t\n\t // (2) Recurse on each half.\n\t\n\t doQuickSort(ary, comparator, p, q - 1);\n\t doQuickSort(ary, comparator, q + 1, r);\n\t }\n\t}\n\t\n\t/**\n\t * Sort the given array in-place with the given comparator function.\n\t *\n\t * @param {Array} ary\n\t * An array to sort.\n\t * @param {function} comparator\n\t * Function to use to compare two items.\n\t */\n\texports.quickSort = function (ary, comparator) {\n\t doQuickSort(ary, comparator, 0, ary.length - 1);\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/* -*- Mode: js; js-indent-level: 2; -*- */\n\t/*\n\t * Copyright 2011 Mozilla Foundation and contributors\n\t * Licensed under the New BSD license. See LICENSE or:\n\t * http://opensource.org/licenses/BSD-3-Clause\n\t */\n\t\n\tvar SourceMapGenerator = __webpack_require__(1).SourceMapGenerator;\n\tvar util = __webpack_require__(4);\n\t\n\t// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n\t// operating systems these days (capturing the result).\n\tvar REGEX_NEWLINE = /(\\r?\\n)/;\n\t\n\t// Newline character code for charCodeAt() comparisons\n\tvar NEWLINE_CODE = 10;\n\t\n\t// Private symbol for identifying `SourceNode`s when multiple versions of\n\t// the source-map library are loaded. This MUST NOT CHANGE across\n\t// versions!\n\tvar isSourceNode = \"$$$isSourceNode$$$\";\n\t\n\t/**\n\t * SourceNodes provide a way to abstract over interpolating/concatenating\n\t * snippets of generated JavaScript source code while maintaining the line and\n\t * column information associated with the original source code.\n\t *\n\t * @param aLine The original line number.\n\t * @param aColumn The original column number.\n\t * @param aSource The original source's filename.\n\t * @param aChunks Optional. An array of strings which are snippets of\n\t * generated JS, or other SourceNodes.\n\t * @param aName The original identifier.\n\t */\n\tfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n\t this.children = [];\n\t this.sourceContents = {};\n\t this.line = aLine == null ? null : aLine;\n\t this.column = aColumn == null ? null : aColumn;\n\t this.source = aSource == null ? null : aSource;\n\t this.name = aName == null ? null : aName;\n\t this[isSourceNode] = true;\n\t if (aChunks != null) this.add(aChunks);\n\t}\n\t\n\t/**\n\t * Creates a SourceNode from generated code and a SourceMapConsumer.\n\t *\n\t * @param aGeneratedCode The generated code\n\t * @param aSourceMapConsumer The SourceMap for the generated code\n\t * @param aRelativePath Optional. The path that relative sources in the\n\t * SourceMapConsumer should be relative to.\n\t */\n\tSourceNode.fromStringWithSourceMap =\n\t function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n\t // The SourceNode we want to fill with the generated code\n\t // and the SourceMap\n\t var node = new SourceNode();\n\t\n\t // All even indices of this array are one line of the generated code,\n\t // while all odd indices are the newlines between two adjacent lines\n\t // (since `REGEX_NEWLINE` captures its match).\n\t // Processed fragments are accessed by calling `shiftNextLine`.\n\t var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n\t var remainingLinesIndex = 0;\n\t var shiftNextLine = function() {\n\t var lineContents = getNextLine();\n\t // The last line of a file might not have a newline.\n\t var newLine = getNextLine() || \"\";\n\t return lineContents + newLine;\n\t\n\t function getNextLine() {\n\t return remainingLinesIndex < remainingLines.length ?\n\t remainingLines[remainingLinesIndex++] : undefined;\n\t }\n\t };\n\t\n\t // We need to remember the position of \"remainingLines\"\n\t var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\t\n\t // The generate SourceNodes we need a code range.\n\t // To extract it current and last mapping is used.\n\t // Here we store the last mapping.\n\t var lastMapping = null;\n\t\n\t aSourceMapConsumer.eachMapping(function (mapping) {\n\t if (lastMapping !== null) {\n\t // We add the code from \"lastMapping\" to \"mapping\":\n\t // First check if there is a new line in between.\n\t if (lastGeneratedLine < mapping.generatedLine) {\n\t // Associate first line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t lastGeneratedLine++;\n\t lastGeneratedColumn = 0;\n\t // The remaining code is added without mapping\n\t } else {\n\t // There is no new line in between.\n\t // Associate the code between \"lastGeneratedColumn\" and\n\t // \"mapping.generatedColumn\" with \"lastMapping\"\n\t var nextLine = remainingLines[remainingLinesIndex] || '';\n\t var code = nextLine.substr(0, mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n\t lastGeneratedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t addMappingWithCode(lastMapping, code);\n\t // No more remaining code, continue\n\t lastMapping = mapping;\n\t return;\n\t }\n\t }\n\t // We add the generated code until the first mapping\n\t // to the SourceNode without any mapping.\n\t // Each line is added as separate string.\n\t while (lastGeneratedLine < mapping.generatedLine) {\n\t node.add(shiftNextLine());\n\t lastGeneratedLine++;\n\t }\n\t if (lastGeneratedColumn < mapping.generatedColumn) {\n\t var nextLine = remainingLines[remainingLinesIndex] || '';\n\t node.add(nextLine.substr(0, mapping.generatedColumn));\n\t remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n\t lastGeneratedColumn = mapping.generatedColumn;\n\t }\n\t lastMapping = mapping;\n\t }, this);\n\t // We have processed all mappings.\n\t if (remainingLinesIndex < remainingLines.length) {\n\t if (lastMapping) {\n\t // Associate the remaining code in the current line with \"lastMapping\"\n\t addMappingWithCode(lastMapping, shiftNextLine());\n\t }\n\t // and add the remaining lines without any mapping\n\t node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n\t }\n\t\n\t // Copy sourcesContent into SourceNode\n\t aSourceMapConsumer.sources.forEach(function (sourceFile) {\n\t var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n\t if (content != null) {\n\t if (aRelativePath != null) {\n\t sourceFile = util.join(aRelativePath, sourceFile);\n\t }\n\t node.setSourceContent(sourceFile, content);\n\t }\n\t });\n\t\n\t return node;\n\t\n\t function addMappingWithCode(mapping, code) {\n\t if (mapping === null || mapping.source === undefined) {\n\t node.add(code);\n\t } else {\n\t var source = aRelativePath\n\t ? util.join(aRelativePath, mapping.source)\n\t : mapping.source;\n\t node.add(new SourceNode(mapping.originalLine,\n\t mapping.originalColumn,\n\t source,\n\t code,\n\t mapping.name));\n\t }\n\t }\n\t };\n\t\n\t/**\n\t * Add a chunk of generated JS to this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.add = function SourceNode_add(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t aChunk.forEach(function (chunk) {\n\t this.add(chunk);\n\t }, this);\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t if (aChunk) {\n\t this.children.push(aChunk);\n\t }\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Add a chunk of generated JS to the beginning of this source node.\n\t *\n\t * @param aChunk A string snippet of generated JS code, another instance of\n\t * SourceNode, or an array where each member is one of those things.\n\t */\n\tSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n\t if (Array.isArray(aChunk)) {\n\t for (var i = aChunk.length-1; i >= 0; i--) {\n\t this.prepend(aChunk[i]);\n\t }\n\t }\n\t else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n\t this.children.unshift(aChunk);\n\t }\n\t else {\n\t throw new TypeError(\n\t \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n\t );\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Walk over the tree of JS snippets in this node and its children. The\n\t * walking function is called once for each snippet of JS and is passed that\n\t * snippet and the its original associated source's line/column location.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n\t var chunk;\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t chunk = this.children[i];\n\t if (chunk[isSourceNode]) {\n\t chunk.walk(aFn);\n\t }\n\t else {\n\t if (chunk !== '') {\n\t aFn(chunk, { source: this.source,\n\t line: this.line,\n\t column: this.column,\n\t name: this.name });\n\t }\n\t }\n\t }\n\t};\n\t\n\t/**\n\t * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n\t * each of `this.children`.\n\t *\n\t * @param aSep The separator.\n\t */\n\tSourceNode.prototype.join = function SourceNode_join(aSep) {\n\t var newChildren;\n\t var i;\n\t var len = this.children.length;\n\t if (len > 0) {\n\t newChildren = [];\n\t for (i = 0; i < len-1; i++) {\n\t newChildren.push(this.children[i]);\n\t newChildren.push(aSep);\n\t }\n\t newChildren.push(this.children[i]);\n\t this.children = newChildren;\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Call String.prototype.replace on the very right-most source snippet. Useful\n\t * for trimming whitespace from the end of a source node, etc.\n\t *\n\t * @param aPattern The pattern to replace.\n\t * @param aReplacement The thing to replace the pattern with.\n\t */\n\tSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n\t var lastChild = this.children[this.children.length - 1];\n\t if (lastChild[isSourceNode]) {\n\t lastChild.replaceRight(aPattern, aReplacement);\n\t }\n\t else if (typeof lastChild === 'string') {\n\t this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n\t }\n\t else {\n\t this.children.push(''.replace(aPattern, aReplacement));\n\t }\n\t return this;\n\t};\n\t\n\t/**\n\t * Set the source content for a source file. This will be added to the SourceMapGenerator\n\t * in the sourcesContent field.\n\t *\n\t * @param aSourceFile The filename of the source file\n\t * @param aSourceContent The content of the source file\n\t */\n\tSourceNode.prototype.setSourceContent =\n\t function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n\t this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n\t };\n\t\n\t/**\n\t * Walk over the tree of SourceNodes. The walking function is called for each\n\t * source file content and is passed the filename and source content.\n\t *\n\t * @param aFn The traversal function.\n\t */\n\tSourceNode.prototype.walkSourceContents =\n\t function SourceNode_walkSourceContents(aFn) {\n\t for (var i = 0, len = this.children.length; i < len; i++) {\n\t if (this.children[i][isSourceNode]) {\n\t this.children[i].walkSourceContents(aFn);\n\t }\n\t }\n\t\n\t var sources = Object.keys(this.sourceContents);\n\t for (var i = 0, len = sources.length; i < len; i++) {\n\t aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n\t }\n\t };\n\t\n\t/**\n\t * Return the string representation of this source node. Walks over the tree\n\t * and concatenates all the various snippets together to one string.\n\t */\n\tSourceNode.prototype.toString = function SourceNode_toString() {\n\t var str = \"\";\n\t this.walk(function (chunk) {\n\t str += chunk;\n\t });\n\t return str;\n\t};\n\t\n\t/**\n\t * Returns the string representation of this source node along with a source\n\t * map.\n\t */\n\tSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n\t var generated = {\n\t code: \"\",\n\t line: 1,\n\t column: 0\n\t };\n\t var map = new SourceMapGenerator(aArgs);\n\t var sourceMappingActive = false;\n\t var lastOriginalSource = null;\n\t var lastOriginalLine = null;\n\t var lastOriginalColumn = null;\n\t var lastOriginalName = null;\n\t this.walk(function (chunk, original) {\n\t generated.code += chunk;\n\t if (original.source !== null\n\t && original.line !== null\n\t && original.column !== null) {\n\t if(lastOriginalSource !== original.source\n\t || lastOriginalLine !== original.line\n\t || lastOriginalColumn !== original.column\n\t || lastOriginalName !== original.name) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t lastOriginalSource = original.source;\n\t lastOriginalLine = original.line;\n\t lastOriginalColumn = original.column;\n\t lastOriginalName = original.name;\n\t sourceMappingActive = true;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t }\n\t });\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t }\n\t for (var idx = 0, length = chunk.length; idx < length; idx++) {\n\t if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n\t generated.line++;\n\t generated.column = 0;\n\t // Mappings end at eol\n\t if (idx + 1 === length) {\n\t lastOriginalSource = null;\n\t sourceMappingActive = false;\n\t } else if (sourceMappingActive) {\n\t map.addMapping({\n\t source: original.source,\n\t original: {\n\t line: original.line,\n\t column: original.column\n\t },\n\t generated: {\n\t line: generated.line,\n\t column: generated.column\n\t },\n\t name: original.name\n\t });\n\t }\n\t } else {\n\t generated.column++;\n\t }\n\t }\n\t });\n\t this.walkSourceContents(function (sourceFile, sourceContent) {\n\t map.setSourceContent(sourceFile, sourceContent);\n\t });\n\t\n\t return { code: generated.code, map: map };\n\t};\n\t\n\texports.SourceNode = SourceNode;\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// source-map.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0fd5815da764db5fb9fe","/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./source-map.js\n// module id = 0\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var sourceRelative = sourceFile;\n if (sourceRoot !== null) {\n sourceRelative = util.relative(sourceRoot, sourceFile);\n }\n\n if (!generator._sources.has(sourceRelative)) {\n generator._sources.add(sourceRelative);\n }\n\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-generator.js\n// module id = 1\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64-vlq.js\n// module id = 2\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/base64.js\n// module id = 3\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 === null) {\n return 1; // aStr2 !== null\n }\n\n if (aStr2 === null) {\n return -1; // aStr1 !== null\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, ''));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n sourceURL = sourceURL || '';\n\n if (sourceRoot) {\n // This follows what Chrome does.\n if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {\n sourceRoot += '/';\n }\n // The spec says:\n // Line 4: An optional source root, useful for relocating source\n // files on a server or removing repeated values in the\n // “sources” entry. This value is prepended to the individual\n // entries in the “source” field.\n sourceURL = sourceRoot + sourceURL;\n }\n\n // Historically, SourceMapConsumer did not take the sourceMapURL as\n // a parameter. This mode is still somewhat supported, which is why\n // this code block is conditional. However, it's preferable to pass\n // the source map URL to SourceMapConsumer, so that this function\n // can implement the source URL resolution algorithm as outlined in\n // the spec. This block is basically the equivalent of:\n // new URL(sourceURL, sourceMapURL).toString()\n // ... except it avoids using URL, which wasn't available in the\n // older releases of node still supported by this library.\n //\n // The spec says:\n // If the sources are not absolute URLs after prepending of the\n // “sourceRoot”, the sources are resolved relative to the\n // SourceMap (like resolving script src in a html document).\n if (sourceMapURL) {\n var parsed = urlParse(sourceMapURL);\n if (!parsed) {\n throw new Error(\"sourceMapURL could not be parsed\");\n }\n if (parsed.path) {\n // Strip the last path component, but keep the \"/\".\n var index = parsed.path.lastIndexOf('/');\n if (index >= 0) {\n parsed.path = parsed.path.substring(0, index + 1);\n }\n }\n sourceURL = join(urlGenerate(parsed), sourceURL);\n }\n\n return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/util.js\n// module id = 4\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/array-set.js\n// module id = 5\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/mapping-list.js\n// module id = 6\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n configurable: true,\n enumerable: true,\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number is 1-based.\n * - column: Optional. the column number in the original source.\n * The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n needle.source = this._findSourceIndex(needle.source);\n if (needle.source < 0) {\n return [];\n }\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n if (sourceRoot) {\n sourceRoot = util.normalize(sourceRoot);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this._absoluteSources = this._sources.toArray().map(function (s) {\n return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n });\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this._sourceMapURL = aSourceMapURL;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Utility function to find the index of a source. Returns -1 if not\n * found.\n */\nBasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n if (this._sources.has(relativeSource)) {\n return this._sources.indexOf(relativeSource);\n }\n\n // Maybe aSource is an absolute URL as returned by |sources|. In\n // this case we can't simply undo the transform.\n var i;\n for (i = 0; i < this._absoluteSources.length; ++i) {\n if (this._absoluteSources[i] == aSource) {\n return i;\n }\n }\n\n return -1;\n};\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @param String aSourceMapURL\n * The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n smc._sourceMapURL = aSourceMapURL;\n smc._absoluteSources = smc._sources.toArray().map(function (s) {\n return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);\n });\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._absoluteSources.slice();\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n var index = this._findSourceIndex(aSource);\n if (index >= 0) {\n return this.sourcesContent[index];\n }\n\n var relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + relativeSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n source = this._findSourceIndex(source);\n if (source < 0) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based. \n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = null;\n if (mapping.name) {\n name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n }\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-map-consumer.js\n// module id = 7\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/binary-search.js\n// module id = 8\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/quick-sort.js\n// module id = 9\n// module chunks = 0","/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex] || '';\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex] || '';\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/source-node.js\n// module id = 10\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file
diff --git a/node_modules/csso/node_modules/source-map/lib/array-set.js b/node_modules/csso/node_modules/source-map/lib/array-set.js
new file mode 100644
index 0000000..fbd5c81
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/array-set.js
@@ -0,0 +1,121 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+var has = Object.prototype.hasOwnProperty;
+var hasNativeMap = typeof Map !== "undefined";
+
+/**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+function ArraySet() {
+ this._array = [];
+ this._set = hasNativeMap ? new Map() : Object.create(null);
+}
+
+/**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+};
+
+/**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ArraySet.prototype.size = function ArraySet_size() {
+ return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;
+};
+
+/**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
+ var sStr = hasNativeMap ? aStr : util.toSetString(aStr);
+ var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ if (hasNativeMap) {
+ this._set.set(aStr, idx);
+ } else {
+ this._set[sStr] = idx;
+ }
+ }
+};
+
+/**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.has = function ArraySet_has(aStr) {
+ if (hasNativeMap) {
+ return this._set.has(aStr);
+ } else {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ }
+};
+
+/**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ if (hasNativeMap) {
+ var idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ } else {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ }
+
+ throw new Error('"' + aStr + '" is not in the set.');
+};
+
+/**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error('No element indexed by ' + aIdx);
+};
+
+/**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+};
+
+exports.ArraySet = ArraySet;
diff --git a/node_modules/csso/node_modules/source-map/lib/base64-vlq.js b/node_modules/csso/node_modules/source-map/lib/base64-vlq.js
new file mode 100644
index 0000000..612b404
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/base64-vlq.js
@@ -0,0 +1,140 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var base64 = require('./base64');
+
+// A single base 64 digit can contain 6 bits of data. For the base 64 variable
+// length quantities we use in the source map spec, the first bit is the sign,
+// the next four bits are the actual value, and the 6th bit is the
+// continuation bit. The continuation bit tells us whether there are more
+// digits in this value following this digit.
+//
+// Continuation
+// | Sign
+// | |
+// V V
+// 101011
+
+var VLQ_BASE_SHIFT = 5;
+
+// binary: 100000
+var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+// binary: 011111
+var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+// binary: 100000
+var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+/**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+}
+
+/**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative
+ ? -shifted
+ : shifted;
+}
+
+/**
+ * Returns the base 64 VLQ encoded value.
+ */
+exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+};
+
+/**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error("Expected more digits in base 64 VLQ value.");
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1));
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+};
diff --git a/node_modules/csso/node_modules/source-map/lib/base64.js b/node_modules/csso/node_modules/source-map/lib/base64.js
new file mode 100644
index 0000000..8aa86b3
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/base64.js
@@ -0,0 +1,67 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+
+/**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+exports.encode = function (number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+};
+
+/**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+exports.decode = function (charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return (charCode - bigA);
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return (charCode - littleA + littleOffset);
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return (charCode - zero + numberOffset);
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+};
diff --git a/node_modules/csso/node_modules/source-map/lib/binary-search.js b/node_modules/csso/node_modules/source-map/lib/binary-search.js
new file mode 100644
index 0000000..010ac94
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/binary-search.js
@@ -0,0 +1,111 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+exports.GREATEST_LOWER_BOUND = 1;
+exports.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ }
+ else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ }
+ else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+}
+
+/**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+};
diff --git a/node_modules/csso/node_modules/source-map/lib/mapping-list.js b/node_modules/csso/node_modules/source-map/lib/mapping-list.js
new file mode 100644
index 0000000..06d1274
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/mapping-list.js
@@ -0,0 +1,79 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+
+/**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+}
+
+/**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+}
+
+/**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+MappingList.prototype.unsortedForEach =
+ function MappingList_forEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+/**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+};
+
+/**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+};
+
+exports.MappingList = MappingList;
diff --git a/node_modules/csso/node_modules/source-map/lib/quick-sort.js b/node_modules/csso/node_modules/source-map/lib/quick-sort.js
new file mode 100644
index 0000000..6a7caad
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/quick-sort.js
@@ -0,0 +1,114 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+// It turns out that some (most?) JavaScript engines don't self-host
+// `Array.prototype.sort`. This makes sense because C++ will likely remain
+// faster than JS when doing raw CPU-intensive sorting. However, when using a
+// custom comparator function, calling back and forth between the VM's C++ and
+// JIT'd JS is rather slow *and* loses JIT type information, resulting in
+// worse generated code for the comparator function than would be optimal. In
+// fact, when sorting with a comparator, these costs outweigh the benefits of
+// sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+// a ~3500ms mean speed-up in `bench/bench.html`.
+
+/**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+}
+
+/**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+function randomIntInRange(low, high) {
+ return Math.round(low + (Math.random() * (high - low)));
+}
+
+/**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+}
+
+/**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+exports.quickSort = function (ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+};
diff --git a/node_modules/csso/node_modules/source-map/lib/source-map-consumer.js b/node_modules/csso/node_modules/source-map/lib/source-map-consumer.js
new file mode 100644
index 0000000..7b99d1d
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/source-map-consumer.js
@@ -0,0 +1,1145 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var util = require('./util');
+var binarySearch = require('./binary-search');
+var ArraySet = require('./array-set').ArraySet;
+var base64VLQ = require('./base64-vlq');
+var quickSort = require('./quick-sort').quickSort;
+
+function SourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+}
+
+SourceMapConsumer.fromSourceMap = function(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+}
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+SourceMapConsumer.prototype._version = 3;
+
+// `__generatedMappings` and `__originalMappings` are arrays that hold the
+// parsed mapping coordinates from the source map's "mappings" attribute. They
+// are lazily instantiated, accessed via the `_generatedMappings` and
+// `_originalMappings` getters respectively, and we only parse the mappings
+// and create these arrays once queried for a source location. We jump through
+// these hoops because there can be many thousands of mappings, and parsing
+// them is expensive, so we only want to do it if we must.
+//
+// Each object in the arrays is of the form:
+//
+// {
+// generatedLine: The line number in the generated code,
+// generatedColumn: The column number in the generated code,
+// source: The path to the original source file that generated this
+// chunk of code,
+// originalLine: The line number in the original source that
+// corresponds to this chunk of generated code,
+// originalColumn: The column number in the original source that
+// corresponds to this chunk of generated code,
+// name: The name of the original symbol which generated this chunk of
+// code.
+// }
+//
+// All properties except for `generatedLine` and `generatedColumn` can be
+// `null`.
+//
+// `_generatedMappings` is ordered by the generated positions.
+//
+// `_originalMappings` is ordered by the original positions.
+
+SourceMapConsumer.prototype.__generatedMappings = null;
+Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+});
+
+SourceMapConsumer.prototype.__originalMappings = null;
+Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+});
+
+SourceMapConsumer.prototype._charIsMappingSeparator =
+ function SourceMapConsumer_charIsMappingSeparator(aStr, index) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+SourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+SourceMapConsumer.GENERATED_ORDER = 1;
+SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+/**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+SourceMapConsumer.prototype.eachMapping =
+ function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings.map(function (mapping) {
+ var source = mapping.source === null ? null : this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ };
+
+/**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+SourceMapConsumer.prototype.allGeneratedPositionsFor =
+ function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {
+ var line = util.getArg(aArgs, 'line');
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, 'source'),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, 'column', 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ var mappings = [];
+
+ var index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ mappings.push({
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+exports.SourceMapConsumer = SourceMapConsumer;
+
+/**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sources = util.getArg(sourceMap, 'sources');
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, 'names', []);
+ var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
+ var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
+ var mappings = util.getArg(sourceMap, 'mappings');
+ var file = util.getArg(sourceMap, 'file', null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function (source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this._absoluteSources = this._sources.toArray().map(function (s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this._sourceMapURL = aSourceMapURL;
+ this.file = file;
+}
+
+BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+/**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) {
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ var i;
+ for (i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+};
+
+/**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+BasicSourceMapConsumer.fromSourceMap =
+ function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
+ var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
+ smc.sourceRoot);
+ smc.file = aSourceMap._file;
+ smc._sourceMapURL = aSourceMapURL;
+ smc._absoluteSources = smc._sources.toArray().map(function (s) {
+ return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL);
+ });
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings.toArray().slice();
+ var destGeneratedMappings = smc.__generatedMappings = [];
+ var destOriginalMappings = smc.__originalMappings = [];
+
+ for (var i = 0, length = generatedMappings.length; i < length; i++) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping;
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(smc.__originalMappings, util.compareByOriginalPositions);
+
+ return smc;
+ };
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+BasicSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ return this._absoluteSources.slice();
+ }
+});
+
+/**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+}
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+BasicSourceMapConsumer.prototype._parseMappings =
+ function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ';') {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ }
+ else if (aStr.charAt(index) === ',') {
+ index++;
+ }
+ else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64VLQ.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error('Found a source, but no line and column');
+ }
+
+ if (segment.length === 3) {
+ throw new Error('Found a source and line, but no column');
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn = previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine = previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn = previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === 'number') {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+/**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+BasicSourceMapConsumer.prototype._findMapping =
+ function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError('Line must be greater than or equal to 1, got '
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError('Column must be greater than or equal to 0, got '
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ };
+
+/**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+BasicSourceMapConsumer.prototype.computeColumnSpans =
+ function SourceMapConsumer_computeColumnSpans() {
+ for (var index = 0; index < this._generatedMappings.length; ++index) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+BasicSourceMapConsumer.prototype.originalPositionFor =
+ function SourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, 'source', null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+ var name = util.getArg(mapping, 'name', null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, 'originalLine', null),
+ column: util.getArg(mapping, 'originalColumn', null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+BasicSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function (sc) { return sc == null; });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+BasicSourceMapConsumer.prototype.sourceContentFor =
+ function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ var index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ var relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ var url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+BasicSourceMapConsumer.prototype.generatedPositionFor =
+ function SourceMapConsumer_generatedPositionFor(aArgs) {
+ var source = util.getArg(aArgs, 'source');
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, 'line'),
+ originalColumn: util.getArg(aArgs, 'column')
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, 'generatedLine', null),
+ column: util.getArg(mapping, 'generatedColumn', null),
+ lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+/**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === 'string') {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ var version = util.getArg(sourceMap, 'version');
+ var sections = util.getArg(sourceMap, 'sections');
+
+ if (version != this._version) {
+ throw new Error('Unsupported version: ' + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function (s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error('Support for url field in sections not implemented.');
+ }
+ var offset = util.getArg(s, 'offset');
+ var offsetLine = util.getArg(offset, 'line');
+ var offsetColumn = util.getArg(offset, 'column');
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error('Section offsets must be ordered and non-overlapping.');
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
+ }
+ });
+}
+
+IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
+IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
+
+/**
+ * The version of the source mapping spec that we are consuming.
+ */
+IndexedSourceMapConsumer.prototype._version = 3;
+
+/**
+ * The list of original sources.
+ */
+Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
+ get: function () {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+});
+
+/**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+IndexedSourceMapConsumer.prototype.originalPositionFor =
+ function IndexedSourceMapConsumer_originalPositionFor(aArgs) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, 'line'),
+ generatedColumn: util.getArg(aArgs, 'column')
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(needle, this._sections,
+ function(needle, section) {
+ var cmp = needle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (needle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+/**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+IndexedSourceMapConsumer.prototype.hasContentsOfAllSources =
+ function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function (s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+/**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+IndexedSourceMapConsumer.prototype.sourceContentFor =
+ function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ else {
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+ };
+
+/**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+IndexedSourceMapConsumer.prototype.generatedPositionFor =
+ function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ var ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+/**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+IndexedSourceMapConsumer.prototype._parseMappings =
+ function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = null;
+ if (mapping.name) {
+ name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === 'number') {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);
+ quickSort(this.__originalMappings, util.compareByOriginalPositions);
+ };
+
+exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
diff --git a/node_modules/csso/node_modules/source-map/lib/source-map-generator.js b/node_modules/csso/node_modules/source-map/lib/source-map-generator.js
new file mode 100644
index 0000000..508bcfb
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/source-map-generator.js
@@ -0,0 +1,425 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var base64VLQ = require('./base64-vlq');
+var util = require('./util');
+var ArraySet = require('./array-set').ArraySet;
+var MappingList = require('./mapping-list').MappingList;
+
+/**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, 'file', null);
+ this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
+ this._skipValidation = util.getArg(aArgs, 'skipValidation', false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+}
+
+SourceMapGenerator.prototype._version = 3;
+
+/**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+SourceMapGenerator.fromSourceMap =
+ function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+/**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+SourceMapGenerator.prototype.addMapping =
+ function SourceMapGenerator_addMapping(aArgs) {
+ var generated = util.getArg(aArgs, 'generated');
+ var original = util.getArg(aArgs, 'original', null);
+ var source = util.getArg(aArgs, 'source', null);
+ var name = util.getArg(aArgs, 'name', null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+/**
+ * Set the source content for a source file.
+ */
+SourceMapGenerator.prototype.setSourceContent =
+ function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+/**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+SourceMapGenerator.prototype.applySourceMap =
+ function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function (mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source)
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+/**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+SourceMapGenerator.prototype._validateMapping =
+ function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
+ aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {
+ throw new Error(
+ 'original.line and original.column are not numbers -- you probably meant to omit ' +
+ 'the original mapping entirely and only map the generated position. If so, pass ' +
+ 'null for the original mapping instead of an object with empty or null values.'
+ );
+ }
+
+ if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) {
+ // Case 1.
+ return;
+ }
+ else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
+ && aOriginal && 'line' in aOriginal && 'column' in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) {
+ // Cases 2 and 3.
+ return;
+ }
+ else {
+ throw new Error('Invalid mapping: ' + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ };
+
+/**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+SourceMapGenerator.prototype._serializeMappings =
+ function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = '';
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = ''
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ';';
+ previousGeneratedLine++;
+ }
+ }
+ else {
+ if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ',';
+ }
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+SourceMapGenerator.prototype._generateSourcesContent =
+ function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function (source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+/**
+ * Externalize the source map.
+ */
+SourceMapGenerator.prototype.toJSON =
+ function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ };
+
+/**
+ * Render the source map being generated to a string.
+ */
+SourceMapGenerator.prototype.toString =
+ function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+exports.SourceMapGenerator = SourceMapGenerator;
diff --git a/node_modules/csso/node_modules/source-map/lib/source-node.js b/node_modules/csso/node_modules/source-map/lib/source-node.js
new file mode 100644
index 0000000..8bcdbe3
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/source-node.js
@@ -0,0 +1,413 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
+var util = require('./util');
+
+// Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+// operating systems these days (capturing the result).
+var REGEX_NEWLINE = /(\r?\n)/;
+
+// Newline character code for charCodeAt() comparisons
+var NEWLINE_CODE = 10;
+
+// Private symbol for identifying `SourceNode`s when multiple versions of
+// the source-map library are loaded. This MUST NOT CHANGE across
+// versions!
+var isSourceNode = "$$$isSourceNode$$$";
+
+/**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+}
+
+/**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+SourceNode.fromStringWithSourceMap =
+ function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var remainingLinesIndex = 0;
+ var shiftNextLine = function() {
+ var lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ var newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function (mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ var code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[remainingLinesIndex] || '';
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function (sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ };
+
+/**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function (chunk) {
+ this.add(chunk);
+ }, this);
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length-1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ }
+ else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ }
+ else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+};
+
+/**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ }
+ else {
+ if (chunk !== '') {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+};
+
+/**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len-1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+};
+
+/**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ }
+ else if (typeof lastChild === 'string') {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ }
+ else {
+ this.children.push(''.replace(aPattern, aReplacement));
+ }
+ return this;
+};
+
+/**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+SourceNode.prototype.setSourceContent =
+ function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ };
+
+/**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+SourceNode.prototype.walkSourceContents =
+ function SourceNode_walkSourceContents(aFn) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ };
+
+/**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function (chunk) {
+ str += chunk;
+ });
+ return str;
+};
+
+/**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function (chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if(lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (var idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function (sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+};
+
+exports.SourceNode = SourceNode;
diff --git a/node_modules/csso/node_modules/source-map/lib/util.js b/node_modules/csso/node_modules/source-map/lib/util.js
new file mode 100644
index 0000000..3ca92e5
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/lib/util.js
@@ -0,0 +1,488 @@
+/* -*- Mode: js; js-indent-level: 2; -*- */
+/*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+/**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+}
+exports.getArg = getArg;
+
+var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+var dataUrlRegexp = /^data:.+\,.+$/;
+
+function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+}
+exports.urlParse = urlParse;
+
+function urlGenerate(aParsedUrl) {
+ var url = '';
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ':';
+ }
+ url += '//';
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + '@';
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+}
+exports.urlGenerate = urlGenerate;
+
+/**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === '.') {
+ parts.splice(i, 1);
+ } else if (part === '..') {
+ up++;
+ } else if (up > 0) {
+ if (part === '') {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join('/');
+
+ if (path === '') {
+ path = isAbsolute ? '/' : '.';
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+}
+exports.normalize = normalize;
+
+/**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || '/';
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined = aPath.charAt(0) === '/'
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+}
+exports.join = join;
+
+exports.isAbsolute = function (aPath) {
+ return aPath.charAt(0) === '/' || urlRegexp.test(aPath);
+};
+
+/**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, '');
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + '/') !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+}
+exports.relative = relative;
+
+var supportsNullProto = (function () {
+ var obj = Object.create(null);
+ return !('__proto__' in obj);
+}());
+
+function identity (s) {
+ return s;
+}
+
+/**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return '$' + aStr;
+ }
+
+ return aStr;
+}
+exports.toSetString = supportsNullProto ? identity : toSetString;
+
+function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+}
+exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+/**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ var cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByOriginalPositions = compareByOriginalPositions;
+
+/**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+}
+
+/**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+}
+exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+/**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ''));
+}
+exports.parseSourceMapInput = parseSourceMapInput;
+
+/**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || '';
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') {
+ sourceRoot += '/';
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ var parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ var index = parsed.path.lastIndexOf('/');
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+}
+exports.computeSourceURL = computeSourceURL;
diff --git a/node_modules/csso/node_modules/source-map/package.json b/node_modules/csso/node_modules/source-map/package.json
new file mode 100644
index 0000000..02db779
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/package.json
@@ -0,0 +1,212 @@
+{
+ "_from": "source-map@^0.6.1",
+ "_id": "source-map@0.6.1",
+ "_inBundle": false,
+ "_integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "_location": "/csso/source-map",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "source-map@^0.6.1",
+ "name": "source-map",
+ "escapedName": "source-map",
+ "rawSpec": "^0.6.1",
+ "saveSpec": null,
+ "fetchSpec": "^0.6.1"
+ },
+ "_requiredBy": [
+ "/csso/css-tree"
+ ],
+ "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "_shasum": "74722af32e9614e9c287a8d0bbde48b5e2f1a263",
+ "_spec": "source-map@^0.6.1",
+ "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\csso\\node_modules\\css-tree",
+ "author": {
+ "name": "Nick Fitzgerald",
+ "email": "nfitzgerald@mozilla.com"
+ },
+ "bugs": {
+ "url": "https://github.com/mozilla/source-map/issues"
+ },
+ "bundleDependencies": false,
+ "contributors": [
+ {
+ "name": "Tobias Koppers",
+ "email": "tobias.koppers@googlemail.com"
+ },
+ {
+ "name": "Duncan Beevers",
+ "email": "duncan@dweebd.com"
+ },
+ {
+ "name": "Stephen Crane",
+ "email": "scrane@mozilla.com"
+ },
+ {
+ "name": "Ryan Seddon",
+ "email": "seddon.ryan@gmail.com"
+ },
+ {
+ "name": "Miles Elam",
+ "email": "miles.elam@deem.com"
+ },
+ {
+ "name": "Mihai Bazon",
+ "email": "mihai.bazon@gmail.com"
+ },
+ {
+ "name": "Michael Ficarra",
+ "email": "github.public.email@michael.ficarra.me"
+ },
+ {
+ "name": "Todd Wolfson",
+ "email": "todd@twolfson.com"
+ },
+ {
+ "name": "Alexander Solovyov",
+ "email": "alexander@solovyov.net"
+ },
+ {
+ "name": "Felix Gnass",
+ "email": "fgnass@gmail.com"
+ },
+ {
+ "name": "Conrad Irwin",
+ "email": "conrad.irwin@gmail.com"
+ },
+ {
+ "name": "usrbincc",
+ "email": "usrbincc@yahoo.com"
+ },
+ {
+ "name": "David Glasser",
+ "email": "glasser@davidglasser.net"
+ },
+ {
+ "name": "Chase Douglas",
+ "email": "chase@newrelic.com"
+ },
+ {
+ "name": "Evan Wallace",
+ "email": "evan.exe@gmail.com"
+ },
+ {
+ "name": "Heather Arthur",
+ "email": "fayearthur@gmail.com"
+ },
+ {
+ "name": "Hugh Kennedy",
+ "email": "hughskennedy@gmail.com"
+ },
+ {
+ "name": "David Glasser",
+ "email": "glasser@davidglasser.net"
+ },
+ {
+ "name": "Simon Lydell",
+ "email": "simon.lydell@gmail.com"
+ },
+ {
+ "name": "Jmeas Smith",
+ "email": "jellyes2@gmail.com"
+ },
+ {
+ "name": "Michael Z Goddard",
+ "email": "mzgoddard@gmail.com"
+ },
+ {
+ "name": "azu",
+ "email": "azu@users.noreply.github.com"
+ },
+ {
+ "name": "John Gozde",
+ "email": "john@gozde.ca"
+ },
+ {
+ "name": "Adam Kirkton",
+ "email": "akirkton@truefitinnovation.com"
+ },
+ {
+ "name": "Chris Montgomery",
+ "email": "christopher.montgomery@dowjones.com"
+ },
+ {
+ "name": "J. Ryan Stinnett",
+ "email": "jryans@gmail.com"
+ },
+ {
+ "name": "Jack Herrington",
+ "email": "jherrington@walmartlabs.com"
+ },
+ {
+ "name": "Chris Truter",
+ "email": "jeffpalentine@gmail.com"
+ },
+ {
+ "name": "Daniel Espeset",
+ "email": "daniel@danielespeset.com"
+ },
+ {
+ "name": "Jamie Wong",
+ "email": "jamie.lf.wong@gmail.com"
+ },
+ {
+ "name": "Eddy Bruël",
+ "email": "ejpbruel@mozilla.com"
+ },
+ {
+ "name": "Hawken Rives",
+ "email": "hawkrives@gmail.com"
+ },
+ {
+ "name": "Gilad Peleg",
+ "email": "giladp007@gmail.com"
+ },
+ {
+ "name": "djchie",
+ "email": "djchie.dev@gmail.com"
+ },
+ {
+ "name": "Gary Ye",
+ "email": "garysye@gmail.com"
+ },
+ {
+ "name": "Nicolas LaleveĢe",
+ "email": "nicolas.lalevee@hibnet.org"
+ }
+ ],
+ "deprecated": false,
+ "description": "Generates and consumes source maps",
+ "devDependencies": {
+ "doctoc": "^0.15.0",
+ "webpack": "^1.12.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "source-map.js",
+ "source-map.d.ts",
+ "lib/",
+ "dist/source-map.debug.js",
+ "dist/source-map.js",
+ "dist/source-map.min.js",
+ "dist/source-map.min.js.map"
+ ],
+ "homepage": "https://github.com/mozilla/source-map",
+ "license": "BSD-3-Clause",
+ "main": "./source-map.js",
+ "name": "source-map",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/mozilla/source-map.git"
+ },
+ "scripts": {
+ "build": "webpack --color",
+ "test": "npm run build && node test/run-tests.js",
+ "toc": "doctoc --title '## Table of Contents' README.md && doctoc --title '## Table of Contents' CONTRIBUTING.md"
+ },
+ "typings": "source-map",
+ "version": "0.6.1"
+}
diff --git a/node_modules/csso/node_modules/source-map/source-map.d.ts b/node_modules/csso/node_modules/source-map/source-map.d.ts
new file mode 100644
index 0000000..8f972b0
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/source-map.d.ts
@@ -0,0 +1,98 @@
+export interface StartOfSourceMap {
+ file?: string;
+ sourceRoot?: string;
+}
+
+export interface RawSourceMap extends StartOfSourceMap {
+ version: string;
+ sources: string[];
+ names: string[];
+ sourcesContent?: string[];
+ mappings: string;
+}
+
+export interface Position {
+ line: number;
+ column: number;
+}
+
+export interface LineRange extends Position {
+ lastColumn: number;
+}
+
+export interface FindPosition extends Position {
+ // SourceMapConsumer.GREATEST_LOWER_BOUND or SourceMapConsumer.LEAST_UPPER_BOUND
+ bias?: number;
+}
+
+export interface SourceFindPosition extends FindPosition {
+ source: string;
+}
+
+export interface MappedPosition extends Position {
+ source: string;
+ name?: string;
+}
+
+export interface MappingItem {
+ source: string;
+ generatedLine: number;
+ generatedColumn: number;
+ originalLine: number;
+ originalColumn: number;
+ name: string;
+}
+
+export class SourceMapConsumer {
+ static GENERATED_ORDER: number;
+ static ORIGINAL_ORDER: number;
+
+ static GREATEST_LOWER_BOUND: number;
+ static LEAST_UPPER_BOUND: number;
+
+ constructor(rawSourceMap: RawSourceMap);
+ computeColumnSpans(): void;
+ originalPositionFor(generatedPosition: FindPosition): MappedPosition;
+ generatedPositionFor(originalPosition: SourceFindPosition): LineRange;
+ allGeneratedPositionsFor(originalPosition: MappedPosition): Position[];
+ hasContentsOfAllSources(): boolean;
+ sourceContentFor(source: string, returnNullOnMissing?: boolean): string;
+ eachMapping(callback: (mapping: MappingItem) => void, context?: any, order?: number): void;
+}
+
+export interface Mapping {
+ generated: Position;
+ original: Position;
+ source: string;
+ name?: string;
+}
+
+export class SourceMapGenerator {
+ constructor(startOfSourceMap?: StartOfSourceMap);
+ static fromSourceMap(sourceMapConsumer: SourceMapConsumer): SourceMapGenerator;
+ addMapping(mapping: Mapping): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ applySourceMap(sourceMapConsumer: SourceMapConsumer, sourceFile?: string, sourceMapPath?: string): void;
+ toString(): string;
+}
+
+export interface CodeWithSourceMap {
+ code: string;
+ map: SourceMapGenerator;
+}
+
+export class SourceNode {
+ constructor();
+ constructor(line: number, column: number, source: string);
+ constructor(line: number, column: number, source: string, chunk?: string, name?: string);
+ static fromStringWithSourceMap(code: string, sourceMapConsumer: SourceMapConsumer, relativePath?: string): SourceNode;
+ add(chunk: string): void;
+ prepend(chunk: string): void;
+ setSourceContent(sourceFile: string, sourceContent: string): void;
+ walk(fn: (chunk: string, mapping: MappedPosition) => void): void;
+ walkSourceContents(fn: (file: string, content: string) => void): void;
+ join(sep: string): SourceNode;
+ replaceRight(pattern: string, replacement: string): SourceNode;
+ toString(): string;
+ toStringWithSourceMap(startOfSourceMap?: StartOfSourceMap): CodeWithSourceMap;
+}
diff --git a/node_modules/csso/node_modules/source-map/source-map.js b/node_modules/csso/node_modules/source-map/source-map.js
new file mode 100644
index 0000000..bc88fe8
--- /dev/null
+++ b/node_modules/csso/node_modules/source-map/source-map.js
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+exports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;
+exports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;
+exports.SourceNode = require('./lib/source-node').SourceNode;
diff --git a/node_modules/csso/package.json b/node_modules/csso/package.json
new file mode 100644
index 0000000..f911f60
--- /dev/null
+++ b/node_modules/csso/package.json
@@ -0,0 +1,96 @@
+{
+ "_from": "csso@^4.0.2",
+ "_id": "csso@4.2.0",
+ "_inBundle": false,
+ "_integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "_location": "/csso",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "csso@^4.0.2",
+ "name": "csso",
+ "escapedName": "csso",
+ "rawSpec": "^4.0.2",
+ "saveSpec": null,
+ "fetchSpec": "^4.0.2"
+ },
+ "_requiredBy": [
+ "/svgo"
+ ],
+ "_resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "_shasum": "ea3a561346e8dc9f546d6febedd50187cf389529",
+ "_spec": "csso@^4.0.2",
+ "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\svgo",
+ "author": {
+ "name": "Sergey Kryzhanovsky",
+ "email": "skryzhanovsky@ya.ru",
+ "url": "https://github.com/afelix"
+ },
+ "browser": {
+ "css-tree": "css-tree/dist/csstree.min.js"
+ },
+ "bugs": {
+ "url": "https://github.com/css/csso/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "deprecated": false,
+ "description": "CSS minifier with structural optimisations",
+ "devDependencies": {
+ "@rollup/plugin-commonjs": "^11.0.1",
+ "@rollup/plugin-json": "^4.0.1",
+ "@rollup/plugin-node-resolve": "^7.0.0",
+ "coveralls": "^3.0.11",
+ "eslint": "^6.8.0",
+ "mocha": "^7.1.1",
+ "nyc": "^15.0.0",
+ "rollup": "^1.29.0",
+ "source-map": "^0.6.1",
+ "terser": "^4.6.3"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "files": [
+ "dist",
+ "lib"
+ ],
+ "homepage": "https://github.com/css/csso",
+ "keywords": [
+ "css",
+ "compress",
+ "minifier",
+ "minify",
+ "optimise",
+ "optimisation",
+ "csstree"
+ ],
+ "license": "MIT",
+ "main": "./lib/index",
+ "maintainers": [
+ {
+ "name": "Roman Dvornov",
+ "email": "rdvornov@gmail.com"
+ }
+ ],
+ "name": "csso",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/css/csso.git"
+ },
+ "scripts": {
+ "build": "rollup --config && terser dist/csso.js --compress --mangle -o dist/csso.min.js",
+ "coverage": "nyc npm test",
+ "coveralls": "nyc report --reporter=text-lcov | coveralls",
+ "hydrogen": "node --trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces --redirect-code-traces-to=code.asm --trace_hydrogen_file=code.cfg --print-opt-code bin/csso --stat -o /dev/null",
+ "lint": "eslint lib test",
+ "lint-and-test": "npm run lint && npm test",
+ "prepublishOnly": "npm run build",
+ "test": "mocha --reporter dot",
+ "travis": "nyc npm run lint-and-test && npm run coveralls"
+ },
+ "version": "4.2.0"
+}